Redis使用中的常见问题

缓存穿透

  • 缓存穿透指的是查询一个一定不存在的数据,由于不存在这个值,导致每次查询都会取DB上查询。
  • 解决方案:
      1. 缓冲一个空值
      1. 在查询之前按照一定规则过滤掉不符合规则的肯定不存在的值
      1. 使用布隆过滤器(BloomFilter),但是有一定的误判率,会将可能不存在的值误判为存在。如果判断为不存在,则不去查DB。

缓存雪崩

  • 缓存雪崩指的是由于大量的key在相同的时间同时过期,导致大量的请求打到DB,导致DB压力过大
  • 解决方案:
      1. 错开过期时间
      1. 查询数据库的时候限流(RateLimit,令牌桶算法)
      1. 加锁查库,先查cache,如果没有内容则获取锁查DB,然后释放锁,唤醒其他线程

热点数据击穿

  • 一些热点数据失效之后,大量的并发查询打到DB,导致DB压力变大
  • 解决方案:
      1. 加锁查库,先查cache,如果没有内容则获取所查DB,然后释放锁,唤醒其他线程
      1. 预判超时,缓存旧值(Guava Cache的RefreshAfterWrite)
      1. 预热,在系统启热点Key放在本地缓存动后先将热点数据加入到缓存
      1. 多级缓存
      • 热点Key放在应用节点本地缓存
      • 远程缓存定时从DB更新
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,130评论 2 89
  • 1.确认是否需要缓存 在使用缓存之前,需要确认你的项目是否真的需要缓存。使用缓存会引入的一定的技术复杂度,后文也将...
    Java黎先生阅读 12,348评论 2 22
  • 一个良好的缓存系统,往往在处理一下几个关键问题上有独到之处:缓存穿透、击穿、雪崩、热点、大Value等 基本位置 ...
    jiangmo阅读 9,689评论 2 107
  • 1.JVM 堆内存和非堆内存 堆和非堆内存按照官方的说法:“Java 虚拟机具有一个堆(Heap),堆是运行时数据...
    yanzhu728阅读 4,457评论 0 0
  • Android系统也有原生的提供了JSON解析的API,但是它的速度非常慢,而且没有提供简单方便的接口来提高开发者...
    凯玲之恋阅读 1,300评论 0 0