key会过期,通过过期时间或者 LRU LFU规则清除
缓存击穿
前置条件
- key过期了
- 发生了高并发
key的过期出现了并发访问数据库
最终目的
阻止高并发请求直接打到数据库
解决方案
通过锁进行阻塞
1.如果key为空,
2.调用api setnx() ->获取锁
3-1. 获得锁的请求去访问数据库
3-2. 失败的请求等待锁请求获取数据并set到redis中
问题1
如果获得锁得请求挂了,怎么办
解决方案
在setnx中对锁得过期时间进行设置
问题2
锁请求没挂,但是锁超时了?
解决方案
一个线程取db
一个线程监控是否取回来
更新延长锁得时间
缓存穿透
前置条件
从业务接收查询得是系统中根本不存在得数据,大量并发直接打到数据库
最终目的
阻止这些无效请求直接打到数据库
解决方案
通过布隆过滤器将数据放在过滤器中,请求过来之后先通过布隆过滤器进行无效请求过滤,再打到redis查询,如果出现击穿,再由击穿解决方案解决
缓存雪崩
前置条件 1
时点性无关的大量的key同时失效,间接造成了大量的访问直接到达数据库
解决方案
- 将key设置随机时间
前置条件 2
按时间节点 key必须过期
解决方案
可以考虑强依赖击穿方案进行解决
前置条件 3
结果类的缓存, 实际业务:数据上报结果缓存在redis中供客户端查询,30分钟过期,过期后客户再进行查询,数据库中存在,需要并发到数据库查询
解决方案
通过bitmap修改业务代码, 存储在bitmap中,0为成功 1为失败,通过bitmap查询到失败,再通过击穿解决方案解决