微服务框架
【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】
多级缓存
文章目录
- 微服务框架
- 多级缓存
- 48 多级缓存
- 48.7 Redis 缓存预热
- 48.7.1 添加Redis 缓存的需求
- 48.7.2 冷启动和缓存预热
- 48.7.3 缓存预热
48 多级缓存
48.7 Redis 缓存预热
48.7.1 添加Redis 缓存的需求
OK,好久不见,
上一次我们已经实现了由 OpenResty 到多台Tomcat 服务器的负载均衡请求【而且用的算法使得它的进程缓存可以永远生效】
但是按照我们最初的设想
请求到达 OpenResty 后,不要直接去问Tomcat 服务器
应该优先查询 Redis,在Redis 缓存未命中时,再去叨扰 Tomcat
这就是我们接下来要做的工作
48.7.2 冷启动和缓存预热
冷启动:服务刚刚启动时,Redis中并没有缓存,如果所有商品数据都在第一次查询时添加缓存,可能会给数据库带来较大压力。
缓存预热:在实际开发中,我们可以利用大数据统计技术【这个又是一个深海】用户访问的热点数据,在项目启动时将这些热点数据提前查询并保存到Redis中。
我们数据量较少,可以在启动时将所有数据都放入缓存中。
48.7.3 缓存预热
- 利用Docker安装Redis
docker run --name redis -p 6379:6379 -d redis redis-server --appendonly yes
试试用本地Redis 客户端连接
OK,没问题
- 在item-service服务中引入Redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
记得刷一下
- 配置Redis地址
- 编写初始化类
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.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* ClassName: RedisHandler
* date: 2022/11/8 16:23
*
* @author DingJiaxiong
*/
@Component
public class RedisHandler implements InitializingBean {
@Autowired
private StringRedisTemplate redisTemplate;
@Autowired
private IItemService itemService;
@Autowired
private IItemStockService stockService;
private static final ObjectMapper MAPPER = new ObjectMapper();
@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);
}
//3. 查询库存信息
List<ItemStock> stockList = stockService.list();
//2. 放入缓存
for (ItemStock stock : stockList) {
//2.1 itemstock 序列化为JSON
String json = MAPPER.writeValueAsString(stock);
//2.2 存入Redis
redisTemplate.opsForValue().set("item:stock:id:" + stock.getId(),json);
}
}
}
现在直接启动一手
启动项目
可以看到,刚一跑起来就去查了数据,说明放到 Redis 了
查看客户端
没毛病,数据库里面一共就 10 条数据, 5 条商品,5 条库存
这就实现了缓存预热