Redis缓存穿透,击穿,雪崩
缓存穿透,击穿,雪崩都归属于服务器的高可用的问题
网络异常,图片无法展示
|
缓存流程
暂时无法在文档外展示此内容
1 缓存穿透(查不到导致的)
如果查询一个id为-1的值,此时缓存中没有,数据库也没有,就会频繁的去数据库中查询,给数据库造成过大的压力
缓存穿透的概念很简单,用户想要查询一个数据,发现redis内存数据库中没有,也就是缓存没有命中,于是向数据库查询,发现数据库也没有,于是本次查询失败,当用户很多的时候,缓存都没有命中(秒杀场景),于是都去数据库查询,这时候给数据库造成过大的压力
场景:秒杀
解决方案:
1 布隆过滤器(Bloom Filter)
布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合就进行丢弃(比如id为-1),从而避免了对数据库的查询压力
使用布隆过滤器也很简单,导入布隆过滤器的包
网络异常,图片无法展示
|
暂时无法在文档外展示此内容
2 缓存空对象
当缓存没有被命中,即使返回的空对象也将其存储起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取,保护了数据库
网络异常,图片无法展示
|
暂时无法在文档外展示此内容
但是这种方法会有两个问题:
1 如果空值能够被存储起来,这就意味着需要更多的空间去存储更多的键,因为这当中可能会有很多的空值的键
2 即使对空值设置了过期时间,还是会存在缓存层的数据会有一段时间窗口的不一致,这对于业务会有一定的影响(缓存中有了,存储中没有)