缓存穿透、击穿、雪崩、热点key问题

本文深入探讨了缓存系统中常见的四大问题:缓存穿透、缓存击穿、缓存雪崩与热点数据失效,针对每种问题提出了有效的解决方案,包括缓存空值、BloomFilter、互斥锁等技术手段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考来源:

缓存世界中的三大问题及解决方案

关于【缓存穿透、缓存击穿、缓存雪崩、热点数据失效】问题的解决方案

 

 定义问题解决方案
缓存穿透

业务系统访问缓存和数据库都查询不到的数据

 

发生情况:

1.恶意攻击,故意营造大量不存在的数据请求

2.代码逻辑错误

请求都会落到数据库中,数据库压力剧增

1.缓存空值

将数据库查询结果为空的key也存储在缓存中

场景:空数据的key数量有限key重复请求概率较高

 

2.BloomFilter

BloomFilter存储目前数据库中存在的所有key

当业务系统有查询请求的时候,首先去BloomFilter中查询该key是否存在。若不存在,直接返回null。若存在,则继续执行后续的流程。

场景:空数据的key各不相同key重复请求概率低

缓存击穿大量的请求同时查询一个 key 时,此时这个key正好失效了,就会导致大量的请求都打到数据库上面去。造成某一时刻数据库请求量过大,压力剧增将热点数据设置为永远不过期;或者基于 redis or zookeeper 实现互斥锁,等待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key 访问数据。
缓存雪崩

某一时刻发生大规模的缓存失效的情况

例:缓存服务宕机

大量的请求进来直接打到DB上面,DB直接挂掉

1.事前

  • 使用集群缓存,保证缓存服务的高可用

2.事中

3.事后

  • 开启Redis持久化机制,尽快恢复缓存集群

热点key缓存会设定一个失效时间,但一些请求量极高的热点数据而言,一旦过了有效时间,此刻将会有大量请求落在数据库上可能会导致数据库崩溃

1.互斥锁

在第一个请求去查询数据库的时候对他加一个互斥锁,其余的查询请求都会被阻塞住,直到锁被释放,从而保护数据库。

但是也是由于它会阻塞其他的线程,此时系统吞吐量会下降。需要结合实际的业务去考虑是否要这么做。

 

2.设置不同的失效时间

在设置缓存过期时间的时候,让失效的时间错开。如:在一个基础时间上加/减一个随机数

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值