浅谈redis缓存雪崩和缓存穿透现象及解决方案

什么是缓存雪崩?

缓存雪崩,是指在某一个时间段,缓存集中过期失效。产生雪崩的原因之一,比如在写本文的时候,马上就要到双十二零点,很快就会迎来一波抢购,这波商品时间比较集中的放入了缓存,假设缓存一个小时。那么到了凌晨一点钟的时候,这批商品的缓存就都过期了。而对这批商品的访问查询,都落到了数据库上,对于数据库而言,就会产生周期性的压力波峰。
在这里插入图片描述
缓存雪崩事件前后的解决方案
在搭建redis时要考虑到 : redis的高可用,主从+哨兵,redis cluster,避免全盘崩溃
在发生雪崩事件时 : 本地ehcache缓存 + hystrix限流&降级,避免MySQL被打死
在发生雪崩事件之后 : redis持久化,快速恢复缓存数据

下面我们再来看一下缓存穿透的现象

击穿:指的是单个key在缓存中查不到,去数据库查询,这样如果数据量不大或者并发不大的话是没有什么问题的。
如果数据库数据量大并且是高并发的情况下那么就可能会造成数据库压力过大而崩溃
注意: 这里指的是单个key发生高并发!!!

解决方法

  1. 通过synchronized+双重检查机制:某个key只让一个线程查询,阻塞其它线程
    缺点 : 会阻塞其他线程
  2. 设置value永不过期
    缺点 : 占空间,内存消耗大,并且不能保持数据最新
  3. 使用互斥锁(mutex key)
    缺点 : 代码复杂度增大,存在死锁的风险,存在线程池阻塞的风险
发布了14 篇原创文章 · 获赞 8 · 访问量 1054

猜你喜欢

转载自blog.csdn.net/weixin_46033563/article/details/103644868