一、缓存击穿
缓存击穿是指:某一热点 key 在缓存和数据库中都存在,它过期时,这时由于并发用户特别多,同时读缓存没读到,又同时去数据库去读,压垮数据库
解决方法
二、缓存雪崩
情况1:由于大量 key 设置了相同的过期时间(数据在缓存和数据库都存在),一旦到达过期时间点,这些 key 集体失效,造成访问这些 key 的请求全部进入数据库。
给某个 key 加锁能解决雪崩吗?
解决方法:
情况2:Redis 实例宕机,大量请求进入数据库
解决方法:
三、缓存穿透
缓存穿透是指:如果一个 key 在缓存和数据库都不存在,那么访问这个 key 每次都会进入数据库
很可能被恶意请求利用
缓存雪崩与缓存击穿都是数据库中有,但缓存暂时缺失
缓存雪崩与缓存击穿都能自然恢复,但缓存穿透则不能
解决方法:
1.如果数据库没有,也将此不存在的 key 关联 null 值放入缓存,缺点是这样的 key 没有任何业务作用,白占空间
2.布隆过滤器
①过滤器可以用来判定 key 不存在,发现这些不存在的 key,把它们过滤掉就好
②需要将所有的 key 都预先加载至布隆过滤器
③布隆过滤器不能删除,因此查询删除的数据一定会发生穿透
四、缓存一致性问题
何为旁路缓存(Cache Aside),它是一种使用缓存的策略
分析1 – 先清缓存,再更新库
有问题
分析2 – 先更新库,再清缓存
会有短暂不一致,但最终会一致
分析3 – 先更新库,再清缓存
假设查询线程 A 查询数据时恰好缓存数据由于时间到期失效,或是第一次查询,但这种几率出现机会很小
分析4 – 用锁解决