缓存穿透、缓存击穿和缓存雪崩的解决方案
# 缓存穿透、缓存击穿和缓存雪崩的解决方案
# 一、缓存雪崩
1、什么是缓存雪崩?
大量的热点 key 设置了相同的过期时间,导在缓存在同一时刻全部失效,造成瞬时数据库请求量大、压力骤增,引起雪崩,甚至导致数据库被打挂。
2、解决方案?
- 过期时间打散
- 热点数据不过期
# 二、缓存穿透
1、什么是缓存穿透?
缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中
2、解决方案?
缓存空对象
如果缓存和数据库都查不到某个 key 的数据就写一个到 Redis 中去并设置过期时间,具体命令如下: SET key value EX 10000,为了防止大量无效key,失效时间尽量设置的短一点
布隆过滤器
对于恶意攻击,向服务器请求大量不存在的数据造成的缓存穿透,还可以用布隆过滤器先做一次过滤,对于不存在的数据布隆过滤器一般都能够过滤掉,不让请求再往后端发送。当布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就肯定不存在。
# 三、缓存击穿(失效)
1、什么是缓存击穿?
某一个热点 key,在缓存过期的一瞬间,同时有大量的请求打进来,由于此时缓存过期了,所以请求最终都会走到数据库,造成瞬时数据库请求量大、压力骤增,甚至可能打垮数据库
2、解决方案?
加锁
CAS,互斥锁
热点数据不过期
直接将缓存设置为不过期,然后由定时任务去异步加载数据,更新缓存