1.什么是缓存穿透
1.1基本概念
缓存命中率是缓存的生命线
缓存失效会导致大量的请求查数据库,阻塞
应该避免缓存穿透
1.2什么是缓存穿透
在缓冲中没有数据,进入数据库查询的行为
- 缓存穿透是不可避免(容量有上限,需要淘汰数据)
- 热点数据28原则
- 要避免大量的请求穿透,数据库扛不住
2.缓存穿透解决方案
2.1回种空值
实现:
- 将空值回存到缓存中
- 由于其是空数据,设置较短的过期时间
缺点
- 存大量的空值内容,占用内存
- 还会占用有用的信息,导致命中率降低
2.2布隆过滤器
实现:
- 由一个二进制数组和一个Hash数组组成
- 根据key hash后,将数组的值置为1
具体实现:
- 初始化一个大数组
- 选择合适hash算法,将用户ID计算出的值映射到大数组
- 每次查询,先查询布隆过滤器
- 有则继续查询缓存
- 没有则直接返回
- false positive
- 元素可能存在 又可能出错
- 元素不存在 一定不存在
- 非常适合解决缓存穿透问题
- 优点
- 提升缓存命中率
- 时间复杂度o(1)
- 缺点
- 存在误判几率
- 原因:因为hash会存在碰撞(容纳数据的数组是有限的)
- 不支持删除元素
- 避免导致判断存在元素的误判
- 解决办法,每次加1,当删除元素后每次减1(将数组的bit位转换成byte,明显增加数组空间)
- 存在误判几率
- 提升
- 可以使用多个hash算法,提升缓存命中率
- 好的建议
- 多个hash函数,减少误判几率
- 提前评估消耗的内存空间
2.3狗桩效应
- 基本概念
- dog-pile effect,当一瞬间缓存失效,导致同一时间的请求并发涌入数据库
- 解决办法
- 热点缓存失效后,启动后台进程,穿透到数据库。缓存未加载之前,访问这个缓存的请求直接返回
- 设置分布式锁,只有获取锁请求才能够够穿透数据库
- 等分布式锁解锁后,缓存中应该就有数据了
3.课程小结
- 回传空值是常见思路,实现简单,占据一定空间(优先使用这种方案)
- 布隆过滤器会引入新的组件
- 狗桩效用可以设置分布式锁+后台线程定时加载
- 缓存的最终目标是减少脆弱的数据库的并发访问