【Redis】缓存穿透、缓存击穿、缓存雪崩产生原因及解决方案
目录
一. 本文对Redis中[缓存穿透]、[缓存击穿]、[缓存雪崩]三种现象产生原因、解决方法进行说明
二. 缓存穿透
1. 原因
缓存不存在或已过期,请求直接打到数据库层
2. 解决方法
- 缓存永不失效
1. 通过设置无过期时间的缓存
2. 定时任务或异步线程定期更新缓存
3. 发现缓存即将过期时延长过期时间(过期时间放在缓存中)
- 利用互斥锁保证同一时刻只有一个请求可以穿过不存在的缓存直接查数据库,其它请求阻塞,直到拿到锁,再从缓存中获取数据。但使用互斥锁会导致系统吞吐量下降
static Object lockObj = new Object();
synchronized (lockObj) {
value = redis.get(key);
if (StringUtils.isNotBlank(value)) {
return value;
}
redis.set(key, value, time);
return value;
}
三. 缓存击穿
1. 原因
缓存不存在或已过期,数据库也不存在数据
2. 解决方法
- 数据库不存在数据时,使用一个默认值回写缓存
- 布隆过滤器
- 互斥锁
四. 缓存雪崩
1. 原因
同一时刻大量缓存失效
2. 解决方法
- 缓存的过期时间尽量均匀分布,避免同时失效
- 热点缓存永不过期
- 互斥锁
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2016-05-20 Jetty+json-lib库抛异常的问题解决过程(java.lang.NoClassDefFoundError: net/sf/json/JSONObject)
2015-05-20 消息队列系列(三):.Rabbitmq Trace的使用
2014-05-20 泛型类及方法的基本使用
2014-05-20 C# 获取属性字段上DescriptionAttribute的值