天天看点

redis访问击穿/穿透/雪崩

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

解决方案

所有client都访问key

失败以后调用setnx()

3-1. 上面成功的client去访问db,并更新redis。

3-2. 上面setnx失败的client,随机sleep几百毫秒,然后重复步骤1。

问题

这个setnx成功的client挂了

-> 设置setnx的过期时间。

setnx的过期时间太短,或者db访问有堵塞,导致在更新redis之前,设置setnx的锁过期了,这样就会有第二个client再去db取值,造成循环。

-> 多线程,一个线程取db,另一个线程监控是否db操作完成,如果没有那就再更新setnx的timeout值。

业务要查询的数据是这个系统不存在的数据,造成redis失效,db空转。

使用布隆过滤器

client包含所有

client包含算法,bitmap放入redis

redis中加入bloom filter pattern

布隆过滤器只能增加,不能删除。

-> 布谷鸟过滤器/空key

大量key同时失效,造成大量访问到达db

redis的key使用随机过期时间

零点所有key必须过期(类似金融系统,某个时间点开始使用新的参数)

-> 还是不可以用,这时就要依赖击穿方案。

-> 在前端业务层加判断零点延时,避免同时产生大量请求的情况。

时点性无关 -> 可以用

继续阅读