写点什么

分布式缓存架构设计

用户头像
李广富
关注
发布于: 2020 年 07 月 08 日

概要:在系统架构中缓存无处不在,比如 CPU 缓存、操作系统缓存、数据库缓存、JVM 编译缓存、CDN 缓存、代理与反向代理缓存、应用程序缓存、分布式对象缓存。


1、什么是缓存?

缓存是指存储在计算机上的一个原始数据复制集,以便于快速访问。它是介于数据访问者和数据源之间的一种高速存储,当数据需要多次读取的时候,用于加快读取的速度。

2、缓存数据如何存储?

比如 CDN 缓存图片时,url 为 key,具体的图片内容为 value。如何在大量数据中进行快速查找数据呢?首先,缓存的表结构为哈希表,本质上它是数组,所以可以通过下标进行访问。如何计算下标呢?通过对 key 计算 hash 并进行按 8 取模,最后的模值即为下标。

3、缓存的关键指标

关键指标为缓存命中率。

  1. 缓存是否有效依赖于能多次重用同一个缓存响应业务请求,这个度量指标被称为缓存命中率;

  2. 如果查询一个缓存,十次查询就此能够得到正确的结果,那么它的命中率为 90%。


4、影响缓存命中率的主要因素

  1. 缓存键集合大小。

缓存中的每个对象使用缓存键进行识别,定位一个对象的唯一方式就是缓存键执行精确匹配。例如,如果想为每个商品缓存在线商品信息,你需要使用商品 ID 作为缓存键。换句话说,缓存键空间是你的应用能够生成的所有键的数量。从统计数字上看,应用生成的唯一键越多,冲用的机会越小。例如,如果想基于客户 IP 地址缓存挑起数据,则可能有多达 40 亿个键;如果要基于客户来源国家缓存天气数据,则可能仅需要几百个缓存键(国家),一定要想办法减少可能的缓存键数量。键数量越少,缓存的效率越高。

2.缓存可使用内存空间

缓存可使用内存空间直接决定了缓存对象的平均大小和缓存对象数量。因为缓存通常存储在内存中,缓存对象可用空间收到严格限制且相对昂贵。如果想缓存更多的对象,就需要先删除老的对象,在添加新的对象。替换(清除)对象会降低缓存命中率,因为缓存对象被删除后,将来的请求将无法命中了。物理上能够缓存的对象越多,缓存的命中率越高。

3.缓存对象生成时间

缓存对象生成时间成为 TTL。在某些场景中,例如,缓存天气预报数据 15 分钟没有问题,此时,可以设置缓存对象预定义 TTL 为 15 分钟。在其它场景中,你可能不能冒险使用过于陈旧的数据。例如,在一个电子商务系统中,店铺管理员可能在任何时候修改商品价格,如果价格需要准确的展示在整个网站中,那么,就需要在每次修改商品价格时,让缓存失效。对象缓存的时间越长,缓存对象被重用的可能性就越高。


5、分布式环境的一致性 hash 算法

不带虚拟节点

带虚拟节点

关于虚拟节点的一致性 hash 算法,见我的另外一篇博客。


用户头像

李广富

关注

还未添加个人签名 2019.11.12 加入

还未添加个人简介

评论

发布
暂无评论
分布式缓存架构设计