缓存雪崩和穿透问题解决方案
1. 雪崩
雪崩是缓存内的数据失效了,大量的请求打入到数据库,造成服务被打爆
解决方案:
0. 缓存的失效时间随机一段时间,避免大量的缓存同时失效
1. 缓存不失效, 后台异步更新
2. 锁排队,拿到锁的线程去更新缓存,未拿到锁的请求降级或等待(线程等待实现)
3. 利用 ConcurrentHashMap 做个细粒度锁, 提高并行度,未取得锁的线程,降级
4. 使用备份缓存(备份缓存,不失效,主动更新),两个缓存都没有的情况下进行降级
2. 穿透
用户通过构造一个数据库里面不存在的参数进行请求, 造成未命中缓存透过缓存,从数据库查又查不到数据,从而达到把流量打到数据库的目标
解决方案:
1. 参数校验
2. 缓存一个空缓存(即为key设置一个默认值)
3. 防火墙,控制请求量,如果穿透标记,
4. 编码算法(做id有效性校验,通过在编码中做计算校验,如校验位等)
5. Bloom Filter 过滤器过滤大部分无效的请求
本质来说 , 雪崩和穿透的解决方案都是保护后端的数据库或者其他的更加珍贵的资源不被流量打爆,所以方案的核心是让更少的请求进入到后台.
排队等待,或者直接返回错误都是比较好的方式, 但是穿透本质来说是一次攻击,可以对这些穿透的流量进行标记, 识别出恶意的请求