缓存穿透,缓存击穿,缓存雪崩相关知识点

key会过期,通过过期时间或者 LRU LFU规则清除

缓存击穿

前置条件

  1. key过期了
  2. 发生了高并发

key的过期出现了并发访问数据库

最终目的

阻止高并发请求直接打到数据库

解决方案

通过锁进行阻塞

1.如果key为空,
2.调用api setnx() ->获取锁
3-1. 获得锁的请求去访问数据库
3-2. 失败的请求等待锁请求获取数据并set到redis中

问题1

如果获得锁得请求挂了,怎么办

解决方案

在setnx中对锁得过期时间进行设置

问题2

锁请求没挂,但是锁超时了?

解决方案

一个线程取db
一个线程监控是否取回来
更新延长锁得时间

缓存穿透

前置条件

从业务接收查询得是系统中根本不存在得数据,大量并发直接打到数据库

最终目的

阻止这些无效请求直接打到数据库

解决方案

通过布隆过滤器将数据放在过滤器中,请求过来之后先通过布隆过滤器进行无效请求过滤,再打到redis查询,如果出现击穿,再由击穿解决方案解决

缓存雪崩

前置条件 1

时点性无关的大量的key同时失效,间接造成了大量的访问直接到达数据库

解决方案

  1. 将key设置随机时间

前置条件 2

按时间节点 key必须过期

解决方案

可以考虑强依赖击穿方案进行解决

前置条件 3

结果类的缓存, 实际业务:数据上报结果缓存在redis中供客户端查询,30分钟过期,过期后客户再进行查询,数据库中存在,需要并发到数据库查询

解决方案

通过bitmap修改业务代码, 存储在bitmap中,0为成功 1为失败,通过bitmap查询到失败,再通过击穿解决方案解决

你可能感兴趣的:(缓存穿透,缓存击穿,缓存雪崩相关知识点)