概述
你好! 这是我第一次写 博客想把自己在学习过程中学到的知识点通过写博客的方式记录下来,希望对你有用。
缓存穿透
一般的缓存系统,都是通过 key 去查找对应的 value 值。
场景:
按照指定的 key 去缓存中查找 value ,如果value 值不存在,没有进行缓存,那么就会直接去后台数据库中进行查找,这样就造成缓存穿透的问题。
解决措施:
1.对查询结果为空的情况也进行缓存,这样下次再进行查询的时候就可以直接在缓存层返回空值,不用在访问一遍数据库,增加数据库压力。
2.缓存时间设置短一点。
3.利用布隆过滤器(不做解释),对一定不存在的 key 进行过滤,避免缓存穿透的发生。
缓存击穿
场景:
当我们缓存中的 key 失效时,大量的请求访问同一个 key ,则会直接访问我们的数据库,对后台数据库造成很大的压力,甚至扛不住直接挂掉。
解决措施:
1.设置热点 key ,对访问比较频繁的 key 进行热点 key 的处理。
2.把过期的时间设置长一点,或者可以设置为不过期。
3.加互斥锁,在进行数据库查询时,吧更新缓存操作加锁,这个缓存访问完之后,会把数据重新更新到缓存中,下次再访问时可从缓存中取。
缓存雪崩
场景:
缓存中大量的 key 同时失效,对 key 的访问又会访问到数据库上,对数据库造成极大的压力,很有可能扛不住挂掉。
解决措施:
1.让失效时间尽量分散失效。
2.构建多个redis实例,挂点一个节点,还有其他节点可以继续访问。
3.设置多级缓存,减小对 redis 缓存的压力。