HM-SpringCloud微服务系列11.3.4【实现多级缓存(3)】

5. Redis缓存预热

5.1 添加redis缓存的需求

image-20220504194216454

5.2 冷启动与缓存预热

Redis缓存会面临冷启动问题:

冷启动:服务刚刚启动时,Redis中并没有缓存,如果所有商品数据都在第一次查询时添加缓存,可能会给数据库带来较大压力。

缓存预热:在实际开发中,我们可以利用大数据统计用户访问的热点数据,在项目启动时将这些热点数据提前查询并保存到Redis中。

我们数据量较少,并且没有数据统计相关功能,目前可以在启动时将所有数据都放入缓存中。

5.3 实现缓存预热

image-20220504194339575


1) 利用Docker安装Redis

docker run --name redis -p 6379:6379 -d redis redis-server --appendonly yes

image-20220504194830964

image-20220504194852107

本地主机RDM工具远程连接虚拟机中docker安装的redis服务

image-20220504195122586

image-20220504195233394

2)在item-service服务中引入Redis依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

image-20220504195516964

3)配置Redis地址

spring:
  redis:
    host: 10.193.193.141

image-20220504195535746

  1. 编写初始化类

缓存预热需要在项目启动时完成,并且必须是拿到RedisTemplate之后。

这里我们利用InitializingBean接口来实现,因为InitializingBean可以在对象被Spring创建并且成员变量全部注入后执行。

package com.heima.item.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.heima.item.pojo.Item;
import com.heima.item.pojo.ItemStock;
import com.heima.item.service.IItemService;
import com.heima.item.service.IItemStockService;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 实现redis缓存预热
 * 项目启动那一刻,就会创建RedisHandler这个Bean,并注入redisTemplate对象,然后执行afterPropertiesSet()
 */
@Component
public class RedisHandler implements InitializingBean {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private IItemService itemService;
    @Autowired
    private IItemStockService stockService;

    /**
     * from jackson
     * spring里一个默认的json处理工具ObjectMapper
     * 静态常量,工具
     */
    private static final ObjectMapper MAPPER = new ObjectMapper();

    /**
     * 初始化缓存
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        // 1. 查询商品信息(此处理应仅查询热点数据,实际因为此次演示数据不多,所以全查全放到缓存中)
        List<Item> itemList = itemService.list();
        // 2. 放入缓存
        for (Item item : itemList) {
            // 2.1 item序列化为json
            String json = MAPPER.writeValueAsString(item);
            // 2.2 存入redis
            redisTemplate.opsForValue().set("item:id:"+item.getId(), json); //key=前缀"item:id:"+id,value=json
        }
        // 3. 查询商品库存信息(同上)
        List<ItemStock> stockList = stockService.list();
        // 4. 放入缓存
        for (ItemStock stock : stockList) {
            // 4.1 stock序列化为json
            String json = MAPPER.writeValueAsString(stock);
            // 4.2 存入redis
            redisTemplate.opsForValue().set("item:stock:id:"+stock.getId(), json);
        }
    }
}

image-20220504201636083

重启8081和8082端口的item-service服务(或者只重启其中一个也可以)

可以从日志中看到在服务启动那一刻有数据查询;查询完后会被放入redis缓存中

image-20220504201919799

image-20220504201938469

现在来看一下RDM中被缓存好的数据

image-20220504202705919

image-20220504202554437

老师演示的效果(不知为啥我的竟然有乱码,难道是编码格式不对?)

image-20220504202638138

image-20220504202456628

PS:此问题已解决,见下一小结https://www.cnblogs.com/yppah/p/16226273.html末尾

posted @   yub4by  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示