Redis中缓存穿透、缓存击穿、缓存雪崩的详解

如何理解Redis缓存的穿透、击穿、雪崩问题:

缓存穿透

是指缓存中和数据库中都没有数据,而用户不断访问,导致这个不存在的数据每次请求都要到存储层去查询,这样失去了意义。

缓存穿透的解决方案有哪些?

  • 缓存null值
  • 布隆过滤
  • 增强id的复杂度,避免被猜测id规律
  • 做好数据的基础格式校验
  • 加强用户权限校验
  • 做好热点参数的限流

讲一讲布隆过滤

布隆过滤器的特点:

容器角度:

  • 如果布隆过滤器判断结果为元素存在,那么该元素实际上元素不一定会存在,由于哈希碰撞,所以会存在一定误判率。
  • 如果布隆过滤器判断结果为元素不存在,那么他就一定不存在,因为无论哈希碰撞啥的,只要该元素计算出下标值对应数组元素值为0,那么该元素就必定不存在。
  • 布隆过滤器是不支持删除元素的,因为如果位图的某个位被多个元素占用着,那么如果删除其中一个元素是否能将该位置0能,置0的话会影响到其他元素,不置0就等于没删除。

元素角度:

  • 如果元素实际不存在,布隆过滤器可能判断存在。
  • 如果元素实际存在,布隆过滤器一定判断存在。

利用第二个特性,我们就能解决持续从数据库查询不存在的值的问题,把要查询的值先过布隆过滤器,判断是否存在,存在就走redis缓存,不存在就直接返回,并且配合缓存空值,可以有效解决缓存穿透问题,虽然存在一定误差,但是在业务范围内允许接受。

  • 第一步先查询数据库数据并加入到布隆过滤器中。
  • 请求发送过来布隆过滤器判断是否命中,命中就走缓存,之后接着看是否走数据库还是直接从缓存获取返回。
  • 如果布隆过滤器miss,就直接返回,不走cache了。

缓存击穿

是缓存中没有数据,而数据库中有数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大。

|------|----------------------------|---------------------------|
| 解决方案 | 优点 | 缺点 |
| 互斥锁 | * 没有额外的内存消耗 * 保证一致性 * 实现简单 | * 线程需要等待,性能受影响 * 可能有死锁风险 |
| 逻辑过期 | * 线程无需等待。性能较好 | * 不保证一致性 * 有额外内存消耗 * 实现复杂 |

缓存雪崩

就是同一时间内,大量的缓存key值同时失效或者redis服务器宕机,导致大量的请求到达数据库,带来巨大的压力

解决方案

​​​​​​​

1. 合理设置缓存过期时间

  • 避免大量缓存数据同时过期,可以设置缓存的过期时间为随机值,或者在缓存集中到期之前提前对热点数据进行预热,将热点数据提前加载到缓存中。

2. 使用多级缓存

  • 将缓存数据分散到不同的缓存节点或缓存服务器中,以减少缓存集中到期的风险。可以结合本地缓存、分布式缓存等方式来实现多级缓存。

3. 限流和熔断

  • 对请求进行限流处理,避免大量请求同时涌入数据库。可以使用限流算法(如令牌桶、漏桶算法)对请求进行限制。同时,可以设置熔断机制,在检测到系统异常时暂时屏蔽部分请求,以保护数据库免受过载。

4. 数据库优化

  • 提高数据库的处理能力和稳定性,可以采用数据库集群、读写分离、垂直拆分等方式来优化数据库架构,提高数据库的负载能力。
相关推荐
晨旭缘1 分钟前
后端日常启动及常用命令(Java)
java·开发语言
CodeAmaz1 分钟前
ArrayList 底层原理
java·arraylist
山峰哥2 分钟前
3000字深度解析:SQL调优如何让数据库查询效率提升10倍
java·服务器·数据库·sql·性能优化·编辑器
iAkuya3 分钟前
(leetcode)力扣100 35 LRU 缓存(双向链表&哈希)
leetcode·链表·缓存
tkevinjd3 分钟前
JUC2(多线程中常用的成员方法)
java
天天摸鱼的java工程师9 分钟前
工作中 Java 程序员如何集成 AI?Spring AI、LangChain4j、JBoltAI 实战对比
java·后端
星辰_mya9 分钟前
RockerMQ之commitlog与consumequeue
java·开发语言
__万波__10 分钟前
二十三种设计模式(二十二)--策略模式
java·设计模式·策略模式
不想上班的小吕10 分钟前
采购申请创建(BAPI_PR_CREATE/BAPI_REQUISITION_CREATE)
java·服务器·数据库
专注VB编程开发20年14 分钟前
压栈顺序是反向(从右往左)的,但正因为是反向压栈,所以第一个参数反而离栈顶(ESP)最近。
java·开发语言·算法