14缓存穿透怎么办?(增加缓存命中率)

117 阅读2分钟

1.什么是缓存穿透

1.1基本概念

缓存命中率是缓存的生命线

缓存失效会导致大量的请求查数据库,阻塞

应该避免缓存穿透

1.2什么是缓存穿透

在缓冲中没有数据,进入数据库查询的行为

  • 缓存穿透是不可避免(容量有上限,需要淘汰数据)
  • 热点数据28原则
  • 要避免大量的请求穿透,数据库扛不住

2.缓存穿透解决方案

2.1回种空值

实现:

  • 将空值回存到缓存中
  • 由于其是空数据,设置较短的过期时间

缺点

  • 存大量的空值内容,占用内存
  • 还会占用有用的信息,导致命中率降低

2.2布隆过滤器

实现:

  • 由一个二进制数组和一个Hash数组组成
  • 根据key hash后,将数组的值置为1

image.png

具体实现:

  • 初始化一个大数组
  • 选择合适hash算法,将用户ID计算出的值映射到大数组
  • 每次查询,先查询布隆过滤器
    • 有则继续查询缓存
    • 没有则直接返回
  • false positive
    • 元素可能存在 又可能出错
    • 元素不存在 一定不存在
    • 非常适合解决缓存穿透问题
  • 优点
    • 提升缓存命中率
    • 时间复杂度o(1)
  • 缺点
    • 存在误判几率
      • 原因:因为hash会存在碰撞(容纳数据的数组是有限的)
    • 不支持删除元素
      • 避免导致判断存在元素的误判
      • 解决办法,每次加1,当删除元素后每次减1(将数组的bit位转换成byte,明显增加数组空间)
  • 提升
    • 可以使用多个hash算法,提升缓存命中率
  • 好的建议
    • 多个hash函数,减少误判几率
    • 提前评估消耗的内存空间

image.png

2.3狗桩效应

  • 基本概念
    • dog-pile effect,当一瞬间缓存失效,导致同一时间的请求并发涌入数据库
  • 解决办法
    • 热点缓存失效后,启动后台进程,穿透到数据库。缓存未加载之前,访问这个缓存的请求直接返回
    • 设置分布式锁,只有获取锁请求才能够够穿透数据库
      • 等分布式锁解锁后,缓存中应该就有数据了

3.课程小结

  • 回传空值是常见思路,实现简单,占据一定空间(优先使用这种方案)
  • 布隆过滤器会引入新的组件
  • 狗桩效用可以设置分布式锁+后台线程定时加载
  • 缓存的最终目标是减少脆弱的数据库的并发访问