redis缓存的穿透和雪崩

最近写项目 用到redis,想要把其中的主要问题和大家分享一下:

 

    首先是  穿透  

           个人的理解因为查询一个不存的数据是,因为第一次查询是到数据库,所以要查询这个不存的数据时会越过redis

    直接去数据库查询,所以才会形成穿透;

解决办法:

      最常见的是布隆过滤器,将所有的数据哈希到一个足够大的bitmap中,不存在的数据会被bitmap掉,

还有一种方法就是将查询结果不论是不是空都存入缓存,不过将为空的缓存时间减短,不超过5分钟。。

 

 

雪崩

 

  是和穿透有很大联系的,在缓存失效的这段时间,发生大量的穿透,所有的查询到达服务器,形成雪崩

 

 

解决办法

  1. 在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
  2. 可以通过缓存reload机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存
  3. 不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀
  4. 做二级缓存,或者双缓存策略。A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期。
posted @ 2017-08-03 20:41  负零度  阅读(190)  评论(0编辑  收藏  举报