redis击穿

redis

Posted by XJ on February 1, 2023

击穿

before:  肯定是发生了高并发 
并且: key过期了

多个client访问redis      redis做缓存(受内存大小)         DB(mysql)
                        key过期
                        LFU/LRU
key过期时来了一大波请求  直接打到DB上 

解决方案:
并发有了,阻止并发到达DB  redis又没有key
redis是单进程 单实例  会排队堵塞
setnx()->锁   不存在的时候才可以设置
所有的请求只要发现key不存在  大家都去抢锁(setnx) 
只有抢锁成功的人才能访问数据库

1 get key <-------------------------------------  
2 setnx                                        |   
3 ok的人去数据库 失败的人 sleep一会 回到第一步 ---- |
问题: 
1、拿到setnx的人挂了  解决:设置锁的过期时间
2、锁超时了(DB时间过长)     
    a、多线程  一个访问DB  一个监控是否取回来  没取回来更新锁时间

穿透

业务接受不了查询的是你系统根本不存在的数据   redis没有 直接打到DB
解决 布隆过滤器  (只能增加 不能删除)==》  换成 布谷鸟
    a、client包含布隆过滤器  redis压力也会减少
    b、
    c、redis集成布隆过滤器   客户端代码会比较简单 

雪崩

多个client访问redis      redis做缓存(受内存大小)         DB(mysql)
大量的key同时失效    间接造成大量的访问到达DB

最容易雪崩的时间   零点
时点性无关  可以用随机过期时间
零点的时候容易大量key过期(强依赖击穿的方案)   
例如0点的时候  数据必须更换   
业务判断 零点延时
解决  随机过期时间

分布式锁

setnx
过期时间
多线程(守护线程)  作用  延长过期时间

zookeeper 做分布式锁