Redis-缓存预热的概念及方法

1. 什么叫「缓存预热」?

预热 = 项目启动后、用户访问前,提前把数据存进 Redis。

也就是:

不让用户第一次访问时才去建缓存, 而是我们自己提前把缓存建好。

这就叫预热

2. 为什么逻辑过期必须预热?

因为逻辑过期的代码是这样的:

java

运行

复制代码
if (缓存不存在) {
    return null;  // 不查库、不建缓存
}

不会自动重建缺失的缓存 。所以缓存必须提前就存在,否则用户直接拿不到数据。

3. 到底怎么预热?(3 种最简单方法)

我给你写能直接用、最简单的

方法 1:项目启动时自动加载(最常用)

用 Spring 的 @PostConstruct

java

运行

复制代码
@PostConstruct
public void preloadHotShops() {
    // 1. 查出所有热点店铺(比如前100个)
    List<Shop> hotShops = list(); 

    // 2. 逐个写入 Redis(逻辑过期方式)
    for (Shop shop : hotShops) {
        saveShop2Redis(shop.getId(), 30L);
    }
}

**意思:**项目一启动,自动把热门店铺存进 Redis。用户一来,Redis 里就有数据。


方法 2:写个接口手动触发(测试最方便)

java

运行

复制代码
@GetMapping("/preload/shop/{id}")
public Result preload(@PathVariable Long id) {
    saveShop2Redis(id, 30L);
    return Result.ok("预热成功");
}

调用一下:/preload/shop/1缓存就建好了。


方法 3:测试时随便查一次就预热

你只要调用一次:

java

运行

复制代码
queryWithLogicalExpire(1L);

内部会走到:

java

运行

复制代码
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 件事:

  1. 查数据库,拿到最新店铺
  2. 打包:店铺 + 逻辑过期时间
  3. 存 Redis,key 永远不过期

它在整个逻辑里的角色是什么?

  • 缓存预热时 → 调用它,提前把数据放进 Redis
  • 缓存逻辑过期时 → 调用它,后台更新缓存

它就是专门负责 "往 Redis 里写逻辑过期缓存" 的工具方法

相关推荐
wdfk_prog4 小时前
ROS教程10:从 gtest 到 rostest——Unit Test、Node 集成测试、rosbag 与 rqt 验证闭环
运维·缓存·docker·容器·ros
程序猿乐锅10 小时前
【黑马点评 | 第四篇】Redis缓存雪崩
java·数据库·spring boot·redis·缓存
HanhahnaH21 小时前
Redis单线程和Tair多线程架构设计对比
分布式·缓存
wdfk_prog1 天前
ROS教程07:从 ros::start() 顺着源码读懂 Master、XML-RPC 与 Topic 注册发现
运维·缓存·docker·容器·ros
Escalating_xu1 天前
【内存管理发展史】从 8086 实模式到分页:CPU 如何把虚拟地址变成物理地址
linux·缓存
wdfk_prog1 天前
用 Git Submodule + Sparse Checkout 管理 RT-Thread:内核、BSP、第三方库与业务代码分层实践
运维·缓存·docker·容器·ros
努力努力再努力wz1 天前
【Docker入门系列】镜像为什么能复用?一文吃透 Docker Image、Registry、运行时架构与常用命令
缓存·docker·容器
shark-chili1 天前
关于AI辅助编程的认知
数据库·人工智能·redis·macos·缓存
oioihoii1 天前
在 Kubernetes 上管好数据库:金仓 KES-Operator 正式落地
缓存
wdfk_prog1 天前
ROS教程06:ROS1 Node 启动与停止流程
运维·缓存·docker·容器·ros