【2023-04-30】redis-缓存雪崩、击穿、穿透,布隆过滤器

文章讨论了缓存系统中常见的三种问题——缓存雪崩、缓存击穿和缓存穿透,以及相应的解决方案。对于缓存雪崩,可以通过设置随机过期时间和服务降级来缓解;缓存击穿可通过不设置过期时间或使用锁来处理;缓存穿透则建议使用布隆过滤器来避免无效查询,尽管它可能有误判率但能有效降低数据库压力。

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

缓存雪崩:redis的大量缓存key失效,所有请求直接到数据库,数据库压力激增,导致其他应用服务请求数据库故障,最终引发整个系统服务崩溃。

解决方案:

​ 1、设置key过期时间的时候,增加一个小范围内的随机数,保证不在同一时间内大量失效。

​ 2、设置服务降级策略。

​ 3、在查询缓存时发现失效后查询数据库使用锁的方式减少数据库压力。

缓存击穿:redis中的某一个热点数据失效,同时大量请求进来,最终请求到数据库,数据库压力激增,导致数据库操作长时间阻塞,影响其他服务。

解决方案:

​ 1、对应redis数据,可以不设置过期时间。

​ 2、在查询缓存时发现失效后查询数据库使用锁的方式减少数据库压力。

缓存穿透:redis和数据库都不存在的数据,大量请求访问此类数据,最终也会请求到数据库,数据库压力激增,导致数据库操作长时间阻塞,影响其他服务。

解决方案:

​ 1、直接返回默认值。

​ 2、redis设置空值。

​ 3、使用布隆过滤器过滤此类请求。

布隆过滤器:使用一个大的位数组bitmap和n个hash函数组成,添加一个key时,对这个key进行n个hash函数执行,并将n个hash函数执行的结果位置在bitmap上标记为1,查询时如果n个hash函数对应位置都为1,那么这个key可能存在,如果有一个不为1,则一定不存在。

为什么说都为1时,key可能存在呢,我们来举个例子。

现在有key1、key2和key3三个,假如key1在hash函数上的执行结果为1,3,6,key2在hash函数上的执行结果为2,4,5,key3在hash函数上的执行结果为7,9,10,现在要查询key4,三个hash函数的执行结果为1,5,9,而1,5,9分别是key1,key2,key3在三个hash函数执行时标记为的1,而不是key4,所以说是不一定存在。

布隆过滤器判定不存在时可以百分百的,判定存在时存在一定误差,这个bitmap越大,存在的误差就越小。

可以用来做海量数据去重,所需空间相对其它解决方案要小的多,在海量数据面前,存在小概率的误差是可以接受的。同理,也可以来做垃圾邮件、短信的过滤

布隆过滤器还有一个缺点就是不能删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值