所谓热点数据,就经常会被查询,但是不经常被修改或者删除的数据,例如我们的淘宝首页的商品数据,往往是访问量最多的,因此我们要把热点数据放在缓存,提高性能,给用户提供良好的体验。
我们实现首页热点数据开发的思路是,首先检查缓存是否有存在热点数据,如果缓存不存在则查询数据库,并把查询结果放到缓存,设置过期时间,下次访问则命中缓存。
下面我们来实现首页热点数据开发!
我们这次的例子是假设开发一个网站上的首页视频,每一个视频卡片包含多个视频,这每个视频卡片都可以是热点数据,因此我们要先封装两个类,视频(VideoDO)和视频卡片(VideoCardDO)。
VideoDO类:
public class VideoDO {
private int id;
private String title;
private String img;
private int price;
public VideoDO() {
}
public VideoDO(int id, String title, String img, int price) {
this.id = id;
this.title = title;
this.img = img;
this.price = price;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getImg() {
return img;
}
public void setImg(String img) {
this.img = img;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
VideoCardDO类:
public class VideoCardDO {
private String title;
private int id;
private int weight;
List list;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
}
接着我们要先在dao层模拟出一些数据:
@Repository
public class VideoCardDao {
public List list(){
try {
TimeUnit.MILLISECONDS.sleep(200);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
List card_list = new ArrayList<>();
VideoCardDO videoCardDO1 = new VideoCardDO();
videoCardDO1.setId(1);
videoCardDO1.setTitle("热点视频");
VideoDO videoDO1 = new VideoDO(1,"Java基础","hhhh",1000);
VideoDO videoDO2 = new VideoDO(2,"Java web","xxxxx",20000);
VideoDO videoDO3 = new VideoDO(3,"Springboot","lllll",3000);
VideoDO videoDO4 = new VideoDO(4,"Springclound","oooo",4000);
List videoDOS1 = new ArrayList<>();
videoDOS1.add(videoDO1);
videoDOS1.add(videoDO2);
videoDOS1.add(videoDO3);
videoDOS1.add(videoDO4);
videoCardDO1.setList(videoDOS1);
VideoCardDO videoCardDO2 = new VideoCardDO();
videoCardDO2.setId(2);
videoCardDO2.setTitle("超级视频");
VideoDO videoDO5 = new VideoDO(5,"Java基础项目","hhhh",5000);
VideoDO videoDO6 = new VideoDO(6,"Java web项目","xxxxx",60000);
VideoDO videoDO7 = new VideoDO(7,"Springboot项目","lllll",7000);
VideoDO videoDO8 = new VideoDO(8,"Springclound项目","oooo",8000);
List videoDOS2 = new ArrayList<>();
videoDOS2.add(videoDO5);
videoDOS2.add(videoDO6);
videoDOS2.add(videoDO7);
videoDOS2.add(videoDO8);
videoCardDO2.setList(videoDOS2);
card_list.add(videoCardDO1);
card_list.add(videoCardDO2);
return card_list;
}
}
service层:
@Service
public class VideoCardServiceImpl implements VideoCardService {
@Autowired
private VideoCardDao videoCardDao;
@Override
public List list() {
return videoCardDao.list();
}
}
接着就是controller层的开发了,这里写了一个是有缓存的,一个是没有缓存的。有缓存的方法的实现思路在文章开头就已经说过啦!
@RestController
@RequestMapping("api/v1/card")
public class VideoCardController {
@Autowired
private VideoCardService videoCardService;
@Autowired
private RedisTemplate redisTemplate;
private static final String VIDEO_CARD_CACHE_KEY = "video:card:key";
/**
* 有缓存
* @return
*/
@GetMapping("list_cache")
public JsonData listCardCache(){
Object o = redisTemplate.opsForValue().get(VIDEO_CARD_CACHE_KEY);
if(o!=null){
List list = (List) o;
return JsonData.buildSuccess(list);
}else {
List list = videoCardService.list();
redisTemplate.opsForValue().set(VIDEO_CARD_CACHE_KEY,list,10, TimeUnit.MINUTES);
return JsonData.buildSuccess(list);
}
}
/**
* 无缓存
* @return
*/
@GetMapping("list_nocache")
public JsonData listCardNoCache(){
List list = videoCardService.list();
return JsonData.buildSuccess(list);
}
}