缓存穿透
问题原因:
查询一个缓存中和数据库都一定没有的值,有人可以利用不存在的Key发起大量请求,攻击数据库;
解决方案:
- 数据库如果也查不到这个值,可以往缓存中回写一个空值,设置一个非常短的过期时间,防止同一时间,大量并发请求打到数据库,导致数据库瘫痪;
- 增加布隆过滤器,类似于hashSet,将所有存在的值放到布隆过滤器里,迅速判断key值的数据是否存在;
缓存击穿
问题原因:
一个非常热点Key,扛着大量的并发请求,某一时刻,Key失效,大量请求打到数据库;
解决方案:
- 热点Key设置永不过期;
- 增加互斥锁,在缓存中查不到数据要去数据库查之前,先去获取分布式锁,获取到锁才去数据库查,不然就等待100ms,再去缓存查;
缓存血崩
问题原因:
同一时刻放入的缓存,在同一时刻集体失效,所有请求打到数据库;
解决方案:
在设置缓存过期时间时,增加随机过期时间的方案,并且还可以根据数据的冷热程度来进行加权,冷门数据的过期时间较短,而热门数据的过期时间长,高效的利用缓存空间;