美文网首页面试精选
Redis常见穿透问题、击穿问题、雪崩问题解决方案

Redis常见穿透问题、击穿问题、雪崩问题解决方案

作者: 站得高看得远 | 来源:发表于2021-07-01 16:10 被阅读0次

Redis常见穿透问题、击穿问题、雪崩问题解决方案

穿透问题

定义

Redis 缓存穿透指的是大量请求Redis缓存时,查找不到对应key,导致请求每次都会触发查询数据库,导致数据库压力过大。如果请求量大的时候极有可能压垮数据库。

解决方案

  1. 做好参数校验,无效的请求直接返回,只能避免一部分情况,攻击者总是可以找到一些没有覆盖的情况。
  2. 如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
  3. 推荐:采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。

击穿问题

定义

某个缓存的key失效,导致大量的请求全部转向查询数据库,导致数据库压力过大。

解决方案

  1. 对热点key设置永不过期或提前预热数据
  2. 加互斥锁,缓存中没有热点key对应的数据时,由获得锁的线程去读取数据库然后设置缓存,没有获得锁的请求等待100ms,再重新去缓存取数据。
  3. 接口限流与熔断,降级。重要的接口一定要做好限流策略,防止用户恶意刷接口,同时要降级准备,当接口中的某些服务不可用时候,进行熔断,失败快速返回机制。

雪崩问题

定义

缓存雪崩主要指的是短时间内大量key失效,导致所有请求全部转向数据库,导致数据库压力过大。

解决方案

  1. 在设置缓存事件时加随机值,避免缓存扎堆失效。
  2. 可以把缓存层设计成高可用的,个别节点宕掉,依然可以提供服务。利用sentinel或cluster实现。
  3. 双缓存机制,缓存A的失效时间为20分钟,缓存B没有失效时间,从缓存A读取数据,缓存A中没有时,去缓存B中读取数据,并且启动一个异步线程来更新缓存A。
  4. 加锁排队(容易造成堵塞,不推荐)

相关文章

网友评论

    本文标题:Redis常见穿透问题、击穿问题、雪崩问题解决方案

    本文链接:https://www.haomeiwen.com/subject/dibjultx.html