缓存击穿:
某个热点数据的缓存key过期了,在key在缓存过期的⼀刻,同时有⼤量的请求到来,这些请求都会击穿到DB,造成瞬时DB请求过⼤。
解决思路:
设置热点数据不过期,定时任务定时更新缓存,或者设置互斥锁(第一个请求发现缓存不存在,先加锁去数据库中查找,并且将查到的数据放入缓存以后再将锁释放)
定时任务更新缓存的解决思路:

设置互斥锁解决思路:

互斥锁伪代码:
input: 访问热点数据的请求到来process:Object value = get(key) from redis缓存if(value!=null){return value;}else{int lock = get(lock) from redis分布式锁if(lock != null){//加锁成功try{//最大程度保证数据库访问的请求尽可能少Object value = get(key) from redis缓存if(value != null)return valuevalue = get(key) from 数据库set(value,timeout) to redis缓存return value}finally{release(lock) in redis分布式锁}}else{//加锁不成功解法1:立即返回空置,即允许部分用户请求失败解法2: 阻塞等待}}
缓存穿透:
查询显然不可能存在的key,比如缓存了优惠券id,攻击者总是查询优惠券id=-1的数据,显然是不可能存在的,造成请求直接打到了数据库。
解决思路:
增加过滤校验的功能,在网关层如果发现数据显然不存在那么就直接拒绝方法。
缓存雪崩:
⼤量的key设置了相同的过期时间,导致在缓存在同⼀时刻全部失效,造成瞬时DB请求增⼤、压⼒骤增,引起雪崩
解决思路:
存数据的过期时间设置随机,防⽌同⼀时间⼤量数据过期现象发⽣,设置热点数据永远不过期,定时任务定时更新
文章转载自梁霖编程工具库,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




