• 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. 时点性无关 -> 可以用
    --------------------------- 知道的更多,不知道的也更多 ---------------------------
  • 相关阅读:
    java实现各种排序算法(非比较排序)
    SpringMVC整合Swagger简单使用及原理分析
    Kotlin学习之委托
    模拟测试框架之Mockito使用及原理分析
    Kotlin学习之基本语法
    Spring整合Mqtt简单使用
    计算机如何存储浮点数
    Kotlin学习之面向对象
    SpringMVC源码分析之一个请求的处理
    RocketMQ
  • 原文地址:https://www.cnblogs.com/mryux/p/15498367.html
Copyright © 2020-2023  润新知