微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

redis访问击穿/穿透/雪崩

redis访问击穿

在某个时刻,redis中的一个key被淘汰了,但是瞬间有大量的请求找这个key,找不到,导致请求被压到db端。
解决方

  1. 所有client都访问key
  2. 失败以后调用setnx()
    3-1. 上面成功的client去访问db,并更新redis
    3-2. 上面setnx失败的client,随机sleep几百毫秒,然后重复步骤1。

问题

  1. 这个setnx成功的client挂了
    -> 设置setnx的过期时间。
  2. setnx的过期时间太短,或者db访问有堵塞,导致在更新redis之前,设置setnx的锁过期了,这样就会有第二个client再去db取值,造成循环。
    -> 多线程,一个线程取db,另一个线程监控是否db操作完成,如果没有那就再更新setnx的timeout值。

redis访问穿透

业务要查询的数据是这个系统不存在的数据,造成redis失效,db空转。
解决方
使用布隆过滤器

  1. client包含所有
  2. client包含算法,bitmap放入redis
  3. redis中加入bloom filter pattern

问题
布隆过滤器只能增加,不能删除
-> 布谷鸟过滤器/空key

redis访问雪崩

大量key同时失效,造成大量访问到达db
解决方
redis的key使用随机过期时间

  1. 零点所有key必须过期(类似金融系统,某个时间点开始使用新的参数)
    -> 还是不可以用,这时就要依赖击穿方案。
    -> 在前端业务层加判断零点延时,避免同时产生大量请求的情况。
  2. 时点性无关 -> 可以用

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐