缓存穿透,缓存雪崩,缓存击穿

金歌  金牌会员 | 2022-6-23 17:12:48 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 810|帖子 810|积分 2430

缓存穿透,缓存雪崩,缓存击穿

本文整理自黑马程序员相关资料
缓存穿透

缓存穿透是指客户端请求的数据在缓存中和数据库中都部存在,这样缓存永远不会生效。因此这些请求都会穿过缓存,最终请求到数据库上,对数据库造成非常大的压力。
常见的解决方案有两种:

  • 缓存空对象:当缓存和数据库都没有请求的数据时,将查询的key的value设置为NULL值缓存到Redis中,下次再查询时会在Redis中查到NULL值,请求不会到达数据库。


    • 优点:实现简单,维护方便
    • 缺点:

      • 因为缓存了空对象,任意key的查询都缓存了NULL值,相当于缓存了很多的无用数据。所以造成了额外了内存消耗。可以通过设置TTL过期时间来减少内存的消耗
      • 可能会存在短期的不一致,取决于NULL值的过期时间。例如对一个key设置了NULL值。但是数据库刚好更新了该key对应的值。而Redis中该key对应的值为NULL,只有在这个key过期之后,才会更新为数据库中的值。


  • 布隆过滤:在客户端与Redis中间加入布隆过滤器,如果布隆过滤器判断查询的数据不存在则直接拒绝。布隆过滤器如果判断不存在则一定不存在,判断存在则可能不存在。


    • 优点:内存占用少,没有多余的key
    • 缺点:

      • 实现复杂
      • 存在误判可能。因为布隆过滤器如果判断不存在则一定不存在,判断存在则可能不存在。


​        缓存穿透的其他解决方案:

  • 增强key的复杂性,避免被猜测key的规律
  • 做好数据的基础格式校验,如果不符合预先设置的格式,直接拒绝。
  • 加强用户权限校验,避免接收不相干用户发出的恶意请求
  • 做好热点参数的限流
缓存雪崩

缓存雪崩是指在同一时段大量缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,给数据库带来巨大压力。
解决方案:

  • 给不同的key的TTL添加随机值,避免大量的key同时到期
  • 利用Redis集群提高服务的可用性,避免Redis服务宕机后的数据丢失和请求直达数据库
  • 给缓存业务添加降级限流策略
  • 给业务添加多级缓存
缓存击穿

缓存击穿问题也叫热点key问题,就是一个高并发访问并且缓存重建业务比较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。
解决方案:
互斥锁:即只允许一个线程进行缓存重建,其他线程在缓存重建成功之前只能不断的重试。

逻辑过期:在热点key的value中设置逻辑过期时间,查询缓存的时候判断逻辑过期时间是否已经过期,如果已经过期,则获取互斥锁另开线程进行缓存重建。其他线程发现过期但获取互斥锁失败,返回过期数据。

两种解决方案的优缺点:
解决方案优点缺点互斥锁因为没有设置逻辑过期时间,所以没有额外的内存消耗。保持一致性。实现简单线程需要等待,性能受影响。可能有死锁风险逻辑过期线程无需等待,性能较好不保证一致性。有额外的内存消耗。实现复杂
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金歌

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表