缓存击穿
当一个key过期时,需要对这个key进行数据重建
在重建的时间内如果有大量的并发请求进入,就会绕过缓存进入数据库,会瞬间击垮DB
重建时间可能因为数据是多个表的混合结果需要分头统计而延长,从而更容易出现缓存击穿问题
缓存击穿的解决方案
添加互斥锁
先查询缓存,如果未命中就尝试获取互斥锁,如果成功
查询数据库进行缓存数据重建
把新数据写入缓存中
最后释放锁
添加互斥锁可以保证
同时只存在一个线程对数据库进行缓存数据重建
如果在缓存数据重建中查询的线程会进入休眠等待数据重建
性能较低,但一致性好
逻辑过期
不设置过期时间使用逻辑过期
通过过期时间字段来定义数据的过期时间
过期时间在新增和更新时进行维护
当查询缓存时,发现数据已经过期
就会通过获取互斥锁的方式对数据进行重建
但重建数据使用新线程,在新线程完成数据重建后释放锁
原本查询缓存的线程会正常返回过期数据
其他查询的线程如果获取互斥锁失败(正在重建)也会正常返回过期数据
性能较高,但不能保证一致性