1. 什么叫「缓存预热」?
预热 = 项目启动后、用户访问前,提前把数据存进 redis。
也就是:
不让用户第一次访问时才去建缓存,而是我们自己提前把缓存建好。
这就叫预热。
2. 为什么逻辑过期必须预热?
因为逻辑过期的代码是这样的:
if (缓存不存在) {
return null; // 不查库、不建缓存
}它不会自动重建缺失的缓存。所以缓存必须提前就存在,否则用户直接拿不到数据。
3. 到底怎么预热?(3 种最简单方法)
我给你写能直接用、最简单的。
方法 1:项目启动时自动加载(最常用)
用 spring 的 @postconstruct
@postconstruct
public void preloadhotshops() {
// 1. 查出所有热点店铺(比如前100个)
list<shop> hotshops = list();
// 2. 逐个写入 redis(逻辑过期方式)
for (shop shop : hotshops) {
saveshop2redis(shop.getid(), 30l);
}
}意思:项目一启动,自动把热门店铺存进 redis。用户一来,redis 里就有数据。
方法 2:写个接口手动触发(测试最方便)
@getmapping("/preload/shop/{id}")
public result preload(@pathvariable long id) {
saveshop2redis(id, 30l);
return result.ok("预热成功");
}调用一下:/preload/shop/1缓存就建好了。
方法 3:测试时随便查一次就预热
你只要调用一次:
querywithlogicalexpire(1l);
内部会走到:
saveshop2redis(id, 20l);
缓存就建好了,这也算手动预热。
saveshop2redis是干嘛的?
一句话说死:它就是把数据库里的店铺数据,查出来,封装成逻辑过期格式,存进 redis 的方法。
private void saveshop2redis(long id, long expireseconds) {
// 1. 根据id查数据库
shop shop = getbyid(id);
// 2. 封装成 redisdata(数据 + 过期时间)
redisdata redisdata = new redisdata();
redisdata.setdata(shop);
redisdata.setexpiretime(localdatetime.now().plusseconds(expireseconds));
// 3. 存进 redis(不给key设过期时间!)
stringredistemplate.opsforvalue().set(cache_shop_key + id, jsonutil.tojsonstr(redisdata));
}它一共干 3 件事:
- 查数据库,拿到最新店铺
- 打包:店铺 + 逻辑过期时间
- 存 redis,key 永远不过期
它在整个逻辑里的角色是什么?
- 缓存预热时 → 调用它,提前把数据放进 redis
- 缓存逻辑过期时 → 调用它,后台更新缓存
它就是专门负责 “往 redis 里写逻辑过期缓存” 的工具方法。
到此这篇关于redis缓存预热的概念及方法详解的文章就介绍到这了,更多相关redis缓存预热内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论