zoukankan      html  css  js  c++  java
  • redis缓存的穿透和雪崩

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

        首先是  穿透  

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

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

    解决办法:

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

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

    雪崩

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

    解决办法

    1. 在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
    2. 可以通过缓存reload机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存
    3. 不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀
    4. 做二级缓存,或者双缓存策略。A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期。
  • 相关阅读:
    P2422 良好的感觉
    拉格朗日插值
    C# 中的委托和事件(详解)
    异步委托
    ManualResetEvent详解
    快速理解C#高级概念事件与委托的区别
    拉格朗日多项式
    oracle 插入一个从别处查询获得字段的值
    decode和nvl的用法
    C#将像素值转换为图片
  • 原文地址:https://www.cnblogs.com/01aa/p/7281787.html
Copyright © 2011-2022 走看看