Redis缓存会面临冷启动问题:
    冷启动:服务刚刚启动时,Redis中并没有缓存,如果所有商品数据都在第一次查询时添加缓存,可能会给数据库带来较大压力。
    缓存预热:在实际开发中,我们可以利用大数据统计用户访问的热点数据,在项目启动时将这些热点数据提前查询并保存到Redis中。

    缓存预热需要在项目启动时完成,并且必须是拿到RedisTemplate之后。
    这里我们利用InitializingBean接口来实现,因为InitializingBean可以在对象被Spring创建并且成员变量全部注入后执行。

    1. @Component
    2. public class RedisHandler implements InitializingBean {
    3. @Autowired
    4. private StringRedisTemplate redisTemplate;
    5. @Autowired
    6. private IItemService itemService;
    7. @Autowired
    8. private IItemStockService stockService;
    9. private static final ObjectMapper MAPPER = new ObjectMapper();
    10. @Override
    11. public void afterPropertiesSet() throws Exception {
    12. // 初始化缓存
    13. // 1.查询商品信息
    14. List<Item> itemList = itemService.list();
    15. // 2.放入缓存
    16. for (Item item : itemList) {
    17. // 2.1.item序列化为JSON
    18. String json = MAPPER.writeValueAsString(item);
    19. // 2.2.存入redis
    20. redisTemplate.opsForValue().set("item:id:" + item.getId(), json);
    21. }
    22. // 3.查询商品库存信息
    23. List<ItemStock> stockList = stockService.list();
    24. // 4.放入缓存
    25. for (ItemStock stock : stockList) {
    26. // 2.1.item序列化为JSON
    27. String json = MAPPER.writeValueAsString(stock);
    28. // 2.2.存入redis
    29. redisTemplate.opsForValue().set("item:stock:id:" + stock.getId(), json);
    30. }
    31. }
    32. }