HM-SpringCloud微服务系列11.3.4【实现多级缓存(3)】
5. Redis缓存预热
5.1 添加redis缓存的需求
5.2 冷启动与缓存预热
Redis缓存会面临冷启动问题:
冷启动:服务刚刚启动时,Redis中并没有缓存,如果所有商品数据都在第一次查询时添加缓存,可能会给数据库带来较大压力。
缓存预热:在实际开发中,我们可以利用大数据统计用户访问的热点数据,在项目启动时将这些热点数据提前查询并保存到Redis中。
我们数据量较少,并且没有数据统计相关功能,目前可以在启动时将所有数据都放入缓存中。
5.3 实现缓存预热
1) 利用Docker安装Redis
docker run --name redis -p 6379:6379 -d redis redis-server --appendonly yes
本地主机RDM工具远程连接虚拟机中docker安装的redis服务
2)在item-service服务中引入Redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
3)配置Redis地址
spring:
redis:
host: 10.193.193.141
- 编写初始化类
缓存预热需要在项目启动时完成,并且必须是拿到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);
}
}
}
重启8081和8082端口的item-service服务(或者只重启其中一个也可以)
可以从日志中看到在服务启动那一刻有数据查询;查询完后会被放入redis缓存中
现在来看一下RDM中被缓存好的数据
老师演示的效果(不知为啥我的竟然有乱码,难道是编码格式不对?)
PS:此问题已解决,见下一小结https://www.cnblogs.com/yppah/p/16226273.html末尾
分类:
微服务
标签:
SpringCloud
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!