缓存的收益与成本
收益
- 加速读写
- 降低后端负载
成本
- 数据不一致
- 代码维护成本更高:多了一层缓存逻辑
- 运维成本:Redis cluster
使用场景
- 降低后端负载: 对高消耗的运算结果进行缓存
- 加速请求响应 I/0
- 大量写合并为批量写:先累计在DB持久化
缓存更新策略
- LRU/LFU/FIFO算法剔除: maxmemory-policy
- 超时剔除:expire
- 主动更新:开发控制生命周期
一致性:3>2>1
低一致性要求时:最大内存和淘汰策略
高一致性要求时:超时剔除和主动更新结合,最大内存和淘汰策略兜底
缓存粒度控制
- 通用性:全量属性更好
- 占用空间:部分属性更好
- 代码维护:表面上全量属性更好
缓存穿透优化
当大量请求无法命中缓存时,DB压力瞬间暴增。访问根本不存在的数据会一直访问DB。原因:1. 业务代码自身问题 2. 恶意攻击,爬虫,排查:业务的响应时间、业务本身问题、相关指标:总调用数、缓存命中数、存储层命中数
解决办法:
- 缓存空对象(最好设置过期时间)弊端:1. 需要更多的键。2. 缓存层和存储层数据短期(过期时间)不一致。
- 布隆过滤器拦截:详细处理
无底洞问题优化
加了硬件性能不升反降
- 优化命令本身 慢查询 keys hgetall bigkey
- 减少网络通信次数
- 降低接入成本:客户端长连接、连接池、NIO
缓存雪崩优化
todo
热点KEY重建优化
- 三个目标
- 减少重建缓存的次数
- 数据尽可能一直
- 减少潜在危险
- 两个解决
- 互斥锁 对重建过程加锁 具有一致性,代码复杂,存在死锁的风险
- 永远不过期 通过判断逻辑过期时间,使用单独线程更新缓存(存在缓存不一致)能杜绝热点key重建问题 维护逻辑过期时间增加为成本,增加内存成本.