第五周 - 笔记
缓存(cache)和缓冲(buffer)的区别
表面区别:缓存是随机读取的(数据不一定被读取),缓冲是顺序读取的(先进缓冲的,一定先读取)
本质区别:缓存的目标是减少读取 DB 总量每次缓存命中都减小了读取 DB 总量。而 buffer 并不能减少读取 DB 总量,只能规整化每次读取数据的尺寸大小。
缓存设计架构的常见考量点
读写方式
value 是全部整体读写,还是只部分读写及变更,是否需要内部计算
KV Size
不同缓存数据的 KV size 如果差异过大,也不能缓存在一起,避免缓存效率的低下和相互影响。
可以在缓存中存下全量数据,把缓存当 DB 存储来用
如果数据量巨大,则在缓存中尽可能只保留频繁访问的热数据,对于冷数据直接访问 DB。
读写峰值
如果小于 10 万 级别,简单分拆到独立 Cache 池即可,超过 10 万 甚至到达 100 万 级的 QPS,则需要对 Cache 进行分层处理,可以同时使用 Local-Cache 配合远程 cache,甚至远程缓存内部继续分层叠加分池进行处理
命中率
缓存的命中率对整个服务体系的性能影响甚大。对于核心高并发访问的业务,需要预留足够的容量,确保核心业务缓存维持较高的命中率。
为了持续保持缓存的命中率,缓存体系需要持续监控,及时进行故障处理或故障转移。同时在部分缓存节点异常、命中率下降时,故障转移方案
过期策略
可以设置较短的过期时间,让冷 key 自动过期;
也可以让 key 带上时间戳,同时设置较长的过期时间,比如很多业务系统内部有这样一些 key:key_20190801
。
缓存安全性
限制源 IP,只允许内网访问,同时对于一些关键性指令,需要增加访问权限,避免被攻击或误操作时,导致重大后果。
缓存读写模式
Cache Aside(旁路缓存)
Cache Aside 模式中,业务应用方
对于写,是更新 DB 后,直接将 key 从 cache 中删除,由 DB 驱动缓存数据的更新
对于读,是先读 cache,如果 cache miss,则读 DB,同时将数据回写到 cache
适用对数据一致性要求比较高的业务,或者是缓存数据更新比较复杂的业务
Read/Write Through(读写穿透)
代理缓存,反向代理缓存,CDN 都是 Read/Write Through 模式
对于写,缓存有(更新缓存,再更新 DB),缓存没有,只更新 DB
对于读,缓存 miss 后,是由缓存服务加载并写入缓存的
适用于数据有冷热之分的
Write Behind Caching(异步缓存写入)
只更新缓存,不直接更新 DB,改成批量异步更新 DB
这种读写模式适合变更频率特别高,但对一致性要求不太高的业务,这样写操作可以异步批量写入 DB,减小 DB 压力
版权声明: 本文为 InfoQ 作者【leo】的原创文章。
原文链接:【http://xie.infoq.cn/article/91da2e9684471a6ad8ef56057】。
本文遵守【CC BY-NC】协议,转载请保留原文出处及本版权声明。
评论