微服务架构 | 缓存 - [常见坑]
@
§1 常见坑总览
- 穿透
强调 缓存层不完全生效,即上了缓存和没上一样
因此 缓存命中率降低 是重点 - 击穿
强调 众多并发的请求在 key 空间上的分布不均匀,通常是热点数据的失效
因此 数据库压力骤增,但缓存运行正常 是重点 - 雪崩
强调 效果与效果的连锁性
因此 仅仅重启不能解决问题 是重点
§2 缓存穿透
成因
缓存命中率降低
- 可能是业务重心变更导致的
出现大量对不存在数据的查询
- 恶意攻击
- 数据到达延时
上游系统将数据推至 服务1,服务1 推至当前服务后才能查询
但查询请求来早了,数据还没有到达当前服务
现象
- 缓存命中率降低
- 应用服务器压力突然变大
- 数据库等其他持久化层压力突然并持续增加
解决方案
- 空白缓存
但过期时间设置较短,否则正常数据的刷新可能不及时
比如 数据到达延时 情况下,太长额过期时间会影响系统效率
注意不要引发击穿 - 白名单
- 可以使用 bitmaps 实现,通过 id 计算偏移量
不在白名单中的请求不允许访问
但不适合陌生访问很多的场景,比如互联网项目
- 可以使用 bitmaps 实现,通过 id 计算偏移量
- BoolmFilter
类似 bitmaps 白名单,时间空间效率极高
但有一定的误判率(判断不存在的一定不存在,反之不确定),同时删除难度较高 - 实时监控
发现命中率急速降低时,研发与运维人员配合排查访问对象和数据库
可以通过设置黑名单限制用户行为
§3 缓存击穿
成因
- 某个或某些热点数据过期
一般是少量几个热点 key 甚至一个 key 导致的,很多教程或视频也强调是 “一个热点数据失效”
但若有有限一组 key 承接了当前环境极重比例的请求,这些 key 集体失效也是击穿
击穿的本质是 众多并发的请求在 key 空间上的分布不均匀,承接高并发访问的就是热点数据
进而少量 key 的失效却造成了极高的并发访问量透过了缓存
现象
- 数据库等其他持久化层压力瞬间增加
- 不一定出现大量 key 过期(通常只是少量)
- 缓存还在正常运行
解决方案
- 预设热点缓存
在服务刚启动时效果十分显著 - 实时续期过期时间
- 使用锁
对 key 失效后重新拉取数据进入缓存的操作加锁,以避免超过并发到达数据库
§4 缓存雪崩
成因
- 短时间内,大量 key 过期
- 注册中心或服务不同时启动造成
缓存服务启动后,将自己注册到注册中心
但刚刚注册一个节点,其他服务就发现了,并集中访问导致缓存节点崩溃
后续启动并注册的缓存节点同理
现象
- 数据库压力持续变大至崩溃
- 服务器压力持续变大至崩溃
解决方案
- 多级缓存
同时存在多种缓冲或持久层,比如 nginx + redis + es - 队列或锁
本质上是直接对用户访问进行限流
有效但可能对用法访问的吞吐量造成损耗 - 动态刷新即将过期 key
需要其他线程扫描 key,对即将过期的重新拉取 - 小范围随机波动的过期时间
在过期时间的基础上增加随机值,防止大面积 key 同时过期

浙公网安备 33010602011771号