缓存的使用与设计
缓存的收益与成本
缓存更新策略
缓存粒度控制
缓存穿透优化
缓存无底洞问题
缓存雪崩优化
热点key重建优化
缓存降级
缓存的收益与成本
收益
加速读写
降低后端负载,例如使用 redis 降低 mysql 负载等。
成本
数据不一致:缓存层和数据层有时间窗口不一致的情况,和更新策略有关。
代码维护成本:多了一层缓存逻辑。
运维成本:例如 Redis Cluster
使用场景
降低后端负载,对高消耗的SQL比如JOIN结果集、分组统计结果缓存。
加速请求响应,利用Redis/Memcache优化IO响应时间。
大量写合并为批量写,如计数器现在Redis累加再批量写DB。
缓存更新策略
三种策略
LRU/LFU/FIFO算法剔除
超时剔除,例如expire。
主动更新,代码层面控制生命周期
对比
策略
一致性
维护成本
LRU/LFU/FIFO剔除算法
最差
低
超时剔除
较差
低
主动更新
强
高
两条建议
对于一致性要求低的缓存:最大内存和淘汰策略,即直接往内存里扔,达到最大内存时直接淘汰
对于一致性要求高的缓存:超时剔除和主动更新结合,最大内存和淘汰策略兜底。
缓存粒度控制
粒度问题
比如要缓存一个mysql中的用户信息:select * from user where id = {id}。
设置用户缓存:set user:{id} '(上面sql语句的结果)'
缓存粒度-全部属性:即缓存 select *的结果
缓存粒度-部分重要属性:比如缓存 select user_name, phone部分字段结果
三个角度
通用性:比如加了个新的字段,全量属性最好。
占用空间:部分属性更好。
代码维护:表面上全量属性会更好。
缓存穿透问题
大量请求不命中
即查询结果一直返回 null ,对于不存在的值,缓存层也没有进行缓存
缓存的使用与设计
缓存的收益与成本
缓存更新策略
缓存粒度控制
缓存穿透优化
缓存无底洞问题
缓存