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. 时点性无关 -> 可以用