String结构之首页热点数据开发实战

所谓热点数据,就经常会被查询,但是不经常被修改或者删除的数据,例如我们的淘宝首页的商品数据,往往是访问量最多的,因此我们要把热点数据放在缓存,提高性能,给用户提供良好的体验。

我们实现首页热点数据开发的思路是,首先检查缓存是否有存在热点数据,如果缓存不存在则查询数据库,并把查询结果放到缓存,设置过期时间,下次访问则命中缓存。

下面我们来实现首页热点数据开发!

我们这次的例子是假设开发一个网站上的首页视频,每一个视频卡片包含多个视频,这每个视频卡片都可以是热点数据,因此我们要先封装两个类,视频(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);
    }


}

你可能感兴趣的:(redis,redis)