Redis缓存穿透、缓存失效、缓存雪崩
2022-04-01 13:16:26 1 举报
Redis缓存穿透、缓存失效、缓存雪崩
作者其他创作
大纲/内容
第三批缓存
非核心业务进行限流和降级
接口层增加校验
这里加锁可以实现多线程场景下,只有一个线程获得锁,其他线程循环等待
缓存过期时间为16点失效
分布式锁
机器宕机,大部分数据失效
使用redis高可用集群架构
布隆过滤器
缓存击穿代码解决方案
缓存空对象
第二批缓存
由于缓存层承载着大量请求, 有效地保护了存储层, 但是如果缓存层由于某些原因不能提供服务(比如超大并发过来,缓存层支撑不住,或者由于缓存设计不好,类似大量请求访问bigkey,导致缓存能支撑的并发急剧下降), 于是大量请求都会打到存储层, 存储层的调用量会暴增, 造成存储层也会级联宕机的情况
缓存失效(击穿):大量缓存数据同一时间失效,并发查询同一条数据,缓存查不到,只能从数据库中查询,这样就会导致大量的请求直接穿透缓存指向数据库,有可能会导致数据库瞬间压力过大直接宕机,比如秒杀时将所有商品批量上架,而过期时间为同一时间,那么当秒杀时,这些商品失效了,大量高并发请求会直接从数据库中查询,导致挂机
三:再次查询缓存
为什么会查询不存在的数据呢
redis缓存穿透
一:将数据存入缓存,设置过期时间
缓存穿透会导致每次查询不存在的数据都要到数据库查询,失去了缓存层对存储层的保护
缓存过期时间相同,比如都在16点失效同一时间失效,可能会导致缓存失效问题
二:返回数据
定义:服务端查询一个根本不存在的数据,缓存层和数据库都没有查询到
第一批缓存
缓存过期时间为16点15分失效
redis缓存失效(击穿)
//设置一个过期时间(300到600之间的一个随机数)int expireTime = new Random().nextInt(300) + 300;
缓存过期时间为16点30分失效
将一批缓存数据的失效时间设置为同一时间段内的不同时间
直接返回
是
查到数据?
redis缓存雪崩
四:查询数据库
在批量增加缓存时最好将这一批数据的缓存过期时间设置为一个时间段内的不同时间
如何解决呢?
布隆过滤器说不存在,一定不存在,说存在,那这个值有可能不存在
否
缓存预热
项目上线前进行项目演练
查询缓存和数据库中都不存在的数据
二:加分布式锁
五:解锁
一:查询缓存
当缓存层数据量非常大以至于支撑不住时,大量的缓存失效了,流量会像奔跑的野牛一样,直接全部打到数据库
如何解决和预防呢?
恶意攻击、爬虫空命中
缓存刚好失效,高并发来了,直接访问数据库
try{}catch{}finally{ 解锁}
业务代码或者数据有问题
互斥锁
查到数据
这里再次查询缓存的目的是:当第一个线程从数据库中查询到数据后,会将数据再次存入到缓存,其余的线程则会直接
0 条评论
下一页