缓存的使用和设计

缓存的收益和成本

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 添加逻辑过期时间,超过逻辑过期时间,单独线程去构建缓存。

猜你喜欢

转载自blog.csdn.net/jcsyl_mshot/article/details/80373038