缓存失效的三种情况:缓存穿透、缓存雪崩、缓存击穿

缓存失效的三种情况:

一、缓存穿透
用户不断发请求访问缓存和数据库中都没有的数据。如访问id为-1的数据或id为特别大不存在的数据。此时用户很可能是攻击者,攻击导致数据库压力过大
解决:缓存空结果(加短暂过期时间)、布隆过滤器、mvc拦截器

二、缓存雪崩
由于设置缓存key采用相同的过期时间,缓存在某一时刻同时失效,请求全部转发带数据库。数据库压力过重导致雪崩

解决
1、规避雪崩:缓存过期时间随机,防止大量数据过期现象发生
2、分布式部署:若缓存数据库是分布式部署,将热点数据均匀分布在不同缓存数据库中
3、设置热点数据永不过期
4、出现雪崩:降级、熔断
事前:尽量保证整个Redis集群的高可用性,发现机器宕机尽快补上。选择内存合适的内存淘汰策略
事中:本地ehcache缓存 + hystrix限流&降级,避免mysql崩溃
事后:利用redis持久化机制保存的数据尽快恢复缓存

三、缓存击穿
与缓存雪崩不同的是
1、击穿是指并发查询同一条数据,缓存中不存在但数据库中存在的数据(一般是缓存时间到期)。此时由于并发用户特别多,同时没能从缓存中读取到数据,而去数据库中去取,引起数据库压力瞬间增大,造成过大压力
2、雪崩是指不同数据同时过期,很多的数据都查不到而查询数据库

解决方案
1、设置热点数据永不过期
2、加互斥锁:业界常用的做法是使用mutex。缓存失效的时候(判断从缓存中取出来的是空值),不是立即取数据库加载,而是先使用缓存工具的某些带成功操作返回值的操作(如redis的setnx和memcache的add)去set一个mutex key,当操作返回成功时,再进行加载load db的操作并回设缓存;否则重试整个get缓存方法

锁时序问题:之前的逻辑是查缓存没有,然后去竞争锁查数据库,这样就造成多次查数据库。
解决方法:竞争到锁后,再次确认缓存中没有,再去查数据库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值