这几个名词天天提,偶尔也背过但是每次都是忘掉,这里我开篇先自己尝试解释一下这三个名词的意思:
- 缓存穿透:额,这个回忆不起来了。
- 缓存击穿:击穿强调是不是一个点的概念,查询不存在的缓存?
- 缓存雪崩:一大片缓存都失效或Redis直接崩掉?
缓存穿透
是什么
上图已经形象的描述出穿透的含义了,Redis缓存压根就不可能存在所要查询数据的key值,Redis就像是被开了一个通道,这样的请求直接无视Redis的。解决方式
加强对入参的校验
比如用户查询ID为-1的信息,ID从1开始自增,那肯定没有这样的数据。在接到-1这个值时就直接返回错误信息。
对无结果的请求缓存一个null值
比如用户查询ID为-1的信息,数据库中没有,此时在Redis中缓存一个 (-1:null)
这样下次再有此类请求就直接走缓存(-1:null)
这对值不可设置时间过长。防止此key在后续业务操作中DB中真的有值了。
布隆过滤器存在性校验
通过布隆过滤器对查询的内容进行判断,是否存在相应数据。这层过滤器,作者认为应该加到,Redis查询后,DB查询前
访问控制
用户查询这种无值数据时,且大批量查询时。那大概率是想搞我们的,于是我们可以直接封他的IP防止他恶意破坏
缓存击穿
是什么
击穿说明缓存有,但是被请求穿过去了。就是某个缓存失效了。导致请求这一数据的众多请求打到了DB上。
解决方式
缓存预热
互斥锁
保证缓存的构建由大量请求中的某一个请求完成,只有其走DB,其他全都走缓存
缓存雪崩
是什么
解决方式
均匀设置Key的过期时间
分布式锁
集群搭建
搭建一个高可用集群