缓存三兄弟——穿透、击穿、雪崩

缓存穿透

        当查询一个不存在的数据时,如果数据库一直不向缓存区写数据,那么查询会一直穿透redis直达数据库,从而导致数据库压力过大可能挂掉。

        解决方案:

        1.当查询一个不存在的数据时,可以向redis中以该查询条件为key创造一个空数据,这样再查询时就不会一直穿透到数据库。优点:简单;缺点:太多空数据导致消耗内存过多,如果此时要以空数据的key储存数据可能导致缓存与数据库不一致。解决方法:为空数据设置TTL,让他们过一段时间自己消失,当再有同样的查询过来是再设置即可,这样可以缓解内存压力。

        2.布隆过滤器:在查询进入redis前,先由布隆过滤器校验一下是否有数据。布隆过滤器中有一个bitmap,一开始所有值都为0。存数据时,将数据的id以三种不同的hash算法计算并将得到的值在bitmap中标为1。这样在查询时,只需要校验key的三个hash算法的值是否为1就可以判断值是否存在。优点:占用内存小,没有多余的key;缺点:有一定的误判率,但总体安全。布隆过滤器说有不一定有,但布隆过滤器说没有就一定没有。

缓存击穿

        当一个数据到达过期时间并正在重建,但此时有大量的请求查询该数据,就会有大量请求到达数据库导致数据库压力过大。

        解决方案:

        1.添加互斥锁:当缓存失效时,第一个进来查询的线程拿到互斥锁并开始重建缓存,重建成功后释放锁。在这段时间里,所有其他查询线程都拿不到锁只能一直重复尝试,直到缓存构建成功时查到数据。

        2.使用逻辑过期:在设置key时,给key设置一个逻辑过期时间字段但不给key设置TTL,这样数据永远不会物理过期。当查询时,第一个线程拿到互斥锁,先读取逻辑过期时间看数据是否过期,如果过期,那么开辟一个新线程更新数据,同时把旧数据返回。此时来查询的其他线程因为拿不到锁所以直接返回旧数据。直到数据更新完后,新来的查询才能拿到新数据。

        优缺点:使用互斥锁可以保证数据的强一致性,但是性能略差;使用逻辑过期性能会更好,但不能保证数据的一致性。

缓存雪崩

        当大量的key同时失效,而此时有大量的查询,或者redis服务宕机了,都会导致同时有大量的请求到达数据库。

        解决方法:

        1.为不同的key设置随机的TTL,让他们在不同的时间过期。2.利用redis集群来预防,如哨兵模式,分布式集群。3.为业务添加降级限流策略。4.给业务添加多级缓存

口诀

        穿透无中生有key,布隆过滤null隔离。

        击穿热点过期key,锁与逻辑解难题。

        雪崩大量过期key,过期时间要随机。

        面试必考三兄弟,可用限流来保底。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值