Redis缓存预热详解

为什么要缓存预热

  • 为了放置缓存击穿:如果系统重启,Redis是空的。大量用户请求热点数据时,缓存未命中,大量请求会直接压到数据库
    导致数据库挂掉。
  • 提升用户体验:预热后,加载时间大大降低

简单来说,缓存预热就是空间换时间

怎么做

  1. 启动时同步预热
@Component
public class CacheWarmUp {
@PostConstruct
public void warmUpCache() {
// 从数据库查询热点数据,并批量写入Redis
List<Product> hotProducts = productMapper.getHotProducts();
hotProducts.forEach(p -> redisTemplate.opsForValue().set("product:" + p.getId(), p));
}
}

项目启动阶段,使用@PostConstruct或者ApplicationRunner执行加载逻辑

适用:缓存数据量不大,启动时加载

  1. 定时任务预热
@Scheduled(cron = "0 0 1 * * ?") // 每天凌晨1点执行
public void scheduledWarmUp() {
// 逻辑同上
}

适用:数据会变化,需要周期性更新的业务

  1. 结合消息队列异步预热

适用:超大数据集,使用MQ触发异步任务,避免堵塞

  1. 外部脚本

使用python批量导数据。
写一个脚本调用redis的SET命令