redis缓存穿透、击穿和雪崩

使用缓存主要目的:提升查询速度和保护数据库等稀缺资源不被占满,引发数据库故障

高并发下这缓存常见问题:缓存穿透、缓存击穿、缓存雪崩引发大量请求落到数据库,导致数据库资源占满,引起数据库故障。

一、缓存穿透

 概念:在高并发下,查询一个不存在的值时,缓存不会被命中,导致大量请求直接落到数据库上,如活动系统里面查询一个不                 存在的活动。

解决方案:

  • 采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
  • 如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

二、缓存击穿

 概念:在高并发下,对一个特定的值进行查询,但是这个时候缓存正好过期了,缓存没有命中,导致大量请求直接落到数据库               上,如活动系统里面查询活动信息,但是在活动进行过程中活动缓存突然过期了。这个和缓存雪崩的区别在于这里针                    对某一key缓存,前者则是很多key。

解决方案:

  • 使用互斥锁(mutex key),简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。
  •  "提前"使用互斥锁(mutex key):在value内部设置1个超时值(timeout1), timeout1比实际的memcache timeout(timeout2)小。当从cache读取到timeout1发现它已经过期时候,马上延长timeout1并重新设置到cache。然后再从数据库加载数据并设置到cache中。
  • 让缓存永不过期:把过期时间存在key对应的value里,如果发现要过期了,通过一个后台的异步线程进行缓存的构建,也就是“逻辑”过期

 

三、缓存雪崩

概念:在高并发下,大量的缓存key在同一时间失效,导致大量的请求落到数据库上,数据库瞬时压力过重雪崩或者Redis宕机,             导致客户端的请求之间流向DB,拖垮DB。如活动系统里面同时进行着非常多的活动,但是在某个时间点所有的活动缓存            全部过期。

解决方案:(限流)

  • 通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
  • 将缓存失效时间分散开,我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。
  • 数据预热通过缓存reload机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀
  • 做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期
     

参考链接:https://baijiahao.baidu.com/s?id=1621964676918714782&wfr=spider&for=pc

https://blog.csdn.net/weixin_42463676/article/details/80845567

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值