【BigHereo 53】---Redis遇到的问题---雪崩,击穿,穿透

野性酷女 2022-06-03 08:45 140阅读 0赞

Redis遇到的问题—-雪崩,击穿,穿透

一,【前言】

Redis常常会遇到的三个问题:

  1. (1)雪崩(多个key被高并发)
  2. (2)击穿(单个key被高并发)
  3. (3)穿透(DBredis都没有找到而出现穿透)

这样的场景一般都比较的纠结, 作为技术部, 我们怎么应对这样场景,做到防患于未然呢?

Center

二,【详情】

  1. **1.1,什么是雪崩?**

概念:高并发原因导致的: 设置了相同的过期时间,导致缓存在同一时刻失效,请求都到DB,瞬间压力过重发生雪崩.

(1) Redis本身因为高并发,崩了.

(2)redis失效了.

Center 1

1.2,雪崩情况怎么解决?

(1)加锁或用队列:让它们去进行资源竞选, 选出相应的redis再去mysql中进行动态的操作.

(2)将缓存失效时间分散开:例如在失效时间基础上增加一个随机值,避免引发集体失效事情.

2.1,什么是击穿?

解答: 某时间段中某个key被高并发访问,导致缓存在同一时刻失效,请求都到DB,瞬间压力过重发生雪崩

注意:雪崩是对很多个key的高并发.

Center 2

2.2,击穿怎么解决或避免呢?

解答:

  1. **1,使用互斥锁(mutex key):**
  2. 缓存失效(值为空),不马上去操作DB,先用工具(eg:redissetNXMemcaceADD)set一个mutexkey,如果有返回值在load db.
  3. **2.提前期使用 互斥锁:**
  4. value内设一个timeout1,比实际timeout2小,如发现1已过期,马上延长2设置到cache 中.
  5. **3,永不过期:**
  6. 设置没有"物理"过期时间,保证了不会出现击穿情况.这方法对性能非常的好,缺点是其余线程可能访问的是老数据.

3.1,什么是缓存穿透?

概念:有请求来, 在mysql数据库中没有找到, 在redis中也没有找到,返回web层就会出现穿透

Center 3

3.2,穿透怎么解决?

  1. 方案一: 程序中添加判断, 进行拦截: 现在程序中进行一个拦截.如果没有就返回,有东西再去数据库中查询.

采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitMap中,一个一定不存在的数据会被这个bitMap拦截掉,从而避免底层存储系统的查询压力.

方案二:将过期时间设短一些: 如果一个查询返回数据为空(不管是数据不存在还是系统故障), 我们仍然把这结构进行缓存,但是设置过期缓存时间很短,最长不要超过5mins.

三,【小结】

  1. 高并发中,常常会出现雪崩,击穿或穿透的现象,这就提醒我们必须做好防患于未然的措施,比如用队列,将缓存失效时间分散,或用程序添加拦截等等进行保护.

发表评论

表情:
评论列表 (有 0 条评论,140人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Redis缓存 - 穿透/雪崩/击穿

    1、缓存穿透 1、缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中,将去查询数据库,但是数据库也无此记录,我们没有将这次查询的 null 写入缓存,这将导致这个不存

    相关 Redis——缓存击穿穿透雪崩

    Redis的缓存击穿、穿透、雪崩,这几个概念是设计大流量接口时所需要考虑的问题,也是面试常问的Redis相关的基础知识,本篇捋一下这几个概念,做一个小结; 大家都知道,计算机