缓存的收益和成本
1.收益
加速读写。 cpu L1/L2/L3 Cache 浏览器缓存
降低后端负载:后端服务器通过前端缓存降低负载
2.成本
数据不一致:缓存层和数据层有时间窗口不一致
代码维护成本
运维成本:Redis cluster
3.使用场景
.对高消耗的SQL:join 结果集统计结果缓存
加速请求响应
大量些合并为批量写。
缓存更新策略
1.LRU/LFU:maxmemory-policy 一致性最差
2.超时剔除:例如expire 一致性较差
3.主动更新:;开发控制生命周期 一致性强 维护成本高
缓存粒度控制
缓存过程:1.从mySQL 获取用户信息 2.设置用户缓存 3.缓存粒度:全部属性?部分属性
1.通用性:全量属性更好
2.占用空间:部分属性更好
3.代码维护:表面上全量属性更好
缓存穿透优化
缓存穿透:大量请求不存在(存储层也没有数据)
1.业务代码自身问题
2.恶意攻击、爬虫
解决方案一:缓存空对象(cache 设置过期时间,减少storage 层压力)【不一致?】
解决方案二:布隆过滤器拦截(在cache 层之前设置拦截)
无底洞问题优化
问题描述:3000 memcache 节点,‘加’机器性能反而下降。批量mget mset。
优化IO:命令本身优化,减少网络通信次数,降低接入成本。
1.串行mget o(keys)网络传输时间
2.串行IO O(nodes)网络时间
3.hash_tag O(1) 网络时间
热点key 重建优化
1.热点key+较长的重建
(大量线程做缓存重建的过程)
三个目标:
减少缓存重建的次数
数据尽可能一致
减少潜在危险
两种解决:
互斥锁:查询数据源和重建过程被锁。(等待过程没有避免,减少重建操作)
永不过期:为每个value 添加逻辑过期时间,超过逻辑过期时间,单独线程去构建缓存。