Redis之缓存雪崩问题解决方案

Redis之缓存雪崩问题解决方案

  • 一、介绍
  • 二、解决方法
    • [1. 锁](#1. 锁)
    • [2. 不同的过期时间](#2. 不同的过期时间)
    • [3. 缓存预热和定时任务](#3. 缓存预热和定时任务)

一、介绍

缓存雪崩,指大量的缓存失效,大量的请求又同时落在数据库。主要的一种诱因是key设置的过期时间都一样。

二、解决方法

1. 锁

加锁,每次只让一个线程可以访问数据库,随后存入缓存。性能太差。

2. 不同的过期时间

最简单有效的解决办法是设置不同的过期时间。比如

java 复制代码
int timeout = 10 + new Random().nextInt(20);
redisTemplate.opsForValue().set(key, JSON.toJSONString(coursePublish), timeout, TimeUnit.SECONDS);

3. 缓存预热和定时任务

使用缓存预热,把数据提前放入缓存,然后根据过期时间,发布合理的定时任务,主动去更新缓存。

缓存预热参考代码如下。

java 复制代码
@Component
public class RedisHandler implements InitializingBean {
    @Autowired
    RedisTemplate redisTemplate;
    @Autowired
    CoursePublishMapper coursePublishMapper;

    @Override
    public void afterPropertiesSet() throws Exception {
        List<CoursePublish> coursePublishList = coursePublishMapper.selectList(new LambdaQueryWrapper<CoursePublish>());
        //缓存预热
        coursePublishList.forEach(coursePublish -> {
            String key = "content:course:publish:" + coursePublish.getId();
            redisTemplate.opsForValue().set(key, JSON.toJSONString(coursePublish));
        });
    }
}
相关推荐
刘~浪地球3 分钟前
Redis 从入门到精通(十三):哨兵与集群
数据库·redis·缓存
一个有温度的技术博主1 小时前
Lua语法详解:从变量声明到循环遍历的避坑指南
redis·缓存·lua
凯尔萨厮2 小时前
Spring学习笔记(基于配置文件)
spring
bobasyu2 小时前
Claude Code 源码笔记 -- queryLoop
java·笔记·spring
计算机学姐2 小时前
基于SpringBoot的高校竞赛管理系统
java·spring boot·后端·spring·信息可视化·tomcat·mybatis
砍材农夫2 小时前
spring-ai 第七模型介绍-向量模型
java·人工智能·spring
一个有温度的技术博主3 小时前
深入多级缓存:JVM进程缓存实战与数据库表拆分策略
jvm·数据库·缓存
一个有温度的技术博主3 小时前
Lua语法进阶:函数封装与条件控制的艺术
redis·分布式·缓存·lua
一个有温度的技术博主3 小时前
突破性能极限:深入解析多级缓存架构设计与实践
redis·缓存
手握风云-3 小时前
Redis:不只是缓存那么简单(三)
缓存