zoukankan      html  css  js  c++  java
  • 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. 时点性无关 -> 可以用
    --------------------------- 知道的更多,不知道的也更多 ---------------------------
  • 相关阅读:
    带修改离线主席树 + 树状数组 ZOJ
    树上主席树 + LCA SPOJ
    基础静态主席树 POJ
    数列分块入门1-9 LibreOJ
    Some about me
    [Java]Thinking in Java 练习2.12
    [Java]Thinking in Java 练习2.10
    [Java]Java中的自动包装
    [Java]Thinking in Java 练习2.2
    [杂记]CodeBlocks下载、安装及设置
  • 原文地址:https://www.cnblogs.com/mryux/p/15498367.html
Copyright © 2011-2022 走看看