redis雪崩&击穿&穿透

Redis在高并发场景下可能遭遇雪崩、击穿和穿透问题,导致数据库压力过大。雪崩是多个key同时过期引发的并发访问,可通过加锁或分散失效时间解决。击穿是单个key失效时大量请求直接到达DB,可使用互斥锁或预加载策略。穿透是指DB和Redis都未找到数据,解决方案包括程序拦截和使用布隆过滤器。预防这些现象的方法包括设置合理的缓存策略和使用保护机制。
摘要由CSDN通过智能技术生成

引言

Redis常常会遇到的三个问题

  • 雪崩:多个key被高并发我们叫做雪崩
  • 击穿:单个key被高并发我们叫做击穿
  • 穿透:DB和Redis都没有找到此数据我们叫做穿透
  • Redis问题

Redis雪崩

什么是雪崩
  • 概念:高并发原因导致的,设置了相同的过期时间,导致缓存在同一时刻请求到DB,瞬间压力过重而发生雪崩
    • Redis本身因为高并发崩了
    • Redis失效了
      Redis缓存雪崩
注意:雪崩是对很多个key的高并发.
  • 解决雪崩方法
    • 加锁或用队列:让它们去进行资源竞选, 选出相应的redis再去mysql中进行动态的操作.
    • 将缓存失效时间分散开:例如在失效时间基础上增加一个随机值,避免引发集体失效事情.
Redis击穿
  • 概念:某时间段中某个key被高并发访问,导致缓存在同一时刻失效,请求都到DB,瞬间压力过重发生击穿
  • 解决击穿或者如何避免
    • 使用互斥锁(mutex key): 缓存失效(值为空),不马上去操作DB,先用工具(eg:redis的setNX或Memcace的ADD)set一个mutexkey,如果有返回值在load db.
    • 提前期使用互斥锁: value内设一个timeout1,比实际timeout2小,如发现1已过期,马上延长2设置到cache 中.
    • 永不过期: 设置没有"物理"过期时间,保证了不会出现击穿情况.这方法对性能非常的好,缺点是其余线程可能访问的是老数据.
Redis穿透
  • 概念:有请求来, 在mysql数据库中没有找到, 在redis中也没有找到,返回web层就会出现穿透
    Redis穿透
  • 如何解决Redis穿透
    • 程序中添加判断, 进行拦截: 现在程序中进行一个拦截.如果没有就返回,有东西再去数据库中查询.
    • 采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitMap中,一个一定不存在的数据会被这个bitMap拦截掉,从而避免底层存储系统的查询压力.
    • 将过期时间设短一些: 如果一个查询返回数据为空(不管是数据不存在还是系统故障), 我们仍然把这结构进行缓存,但是设置过期缓存时间很短,最长不要超过5mins.

结尾

高并发中,常常会出现此三种现象,提醒我们必须做好防患措施,例如使用队列,将缓存失效时间分散,或用程序添加拦截等等进行保护(下期)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值