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 做分布式锁