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访问穿透
业务要查询的数据是这个系统不存在的数据,造成redis失效,db空转。
解决方案
使用布隆过滤器
- client包含所有
- client包含算法,bitmap放入redis
- redis中加入bloom filter pattern
问题
布隆过滤器只能增加,不能删除。
-> 布谷鸟过滤器/空key
redis访问雪崩
大量key同时失效,造成大量访问到达db
解决方案
redis的key使用随机过期时间
- 零点所有key必须过期(类似金融系统,某个时间点开始使用新的参数)
-> 还是不可以用,这时就要依赖击穿方案。
-> 在前端业务层加判断零点延时,避免同时产生大量请求的情况。 - 时点性无关 -> 可以用