互联网中的缓存
缓存(Cache)
存储在计算机上的一个原始数据复制集,以便于访问。
缓存是介于数据访问者和数据源之间的一种高速、临时存储,当数据需要`多次读取`的时候,用于加快读取的速度。
1 缓冲(Buffer)是什么
也是一种高速存储,解决两个设备读取数据速度不匹配问题。
2 缓存应用场景
CPU 缓存
操作系统缓存
数据库缓存
语言编译缓存
CDN 缓存
代理和反向代理缓存
前端缓存 - 移动端、浏览器缓存
应用程序缓存 - 本地缓存、页面静态化
分布式对象缓存
3 缓存数据存储
3.1 Hash 表
数据已 key value 形式存储在`数组`中,计算 key 值 hashcode ,计算 hashcode 对应 hash 表索引。
hashcode 求模计算 hash 表索引
3.2 树
4 缓存的关键指标 - 缓存命中率
缓存是否有效依赖于能多少次重用同一个缓存相应业务请求,这个度量指标被称为缓存命中率。
4.1 影响缓存命中率的主要指标
4.1.1 缓存键集合大小
缓存中使用键来唯一标识一个对象。例如, 商品 ID、IP 地址、国家名称等。键数量越少,数据被缓存的可能性越高,缓存的效率越高。
4.1.2 缓存可使用物理空间
缓存物理资源是有限的,不能无限扩展。缓存资源不足时,需要删除部分已缓存数据(LRU)。缓存物理空间越大能缓存的数据越多,缓存命中率越高。
4.1.3 缓存对象生存时间
TTL(Time To Live)。使用缓存面临的一个问题是数据一致性,为了保证一定程度上的一致性,需要对缓存设置有效时间或者在数据更新时通知删除。业务是变动可能性越小、有效时间越长的缓存命中率越高。
5 缓存分类
5.1 代理缓存
PC 用户端自建网络代理服务器,代理缓存网络访问。
5.2 反向代理缓存
服务端网络访问反向代理服务器。
5.3 内容分发网络(CDN)
网络运营商托管反向代理服务器,主要面向视频、图片等流量需求大的网站。
5.4 前端缓存
浏览器、App 等用户端本地缓存。
5.5 服务端缓存
后端应用本地缓存。
缓存在当前函数中
缓存在共享内存中
5.5.1 常见工具
5.5.1.1 Map
5.5.1.2 OSCache
5.5.1.3 Ecache
5.5.1.4 JBoss 缓存
5.5.1.5 Guava Cache
5.6 远程分布式集中缓存
5.6.1 Memcached
share nothing,服务器集群之间不通信。
只解决数据缓存问题,不充当可靠数据源,允许少部分数据不可用。
Memcached 客户端集群路由
hash 表
根据集群服务器数量做 mod, 应用程序需要维护服务器 ip 列表,且当扩展服务器时大部分缓存数据失效。
一致性 hash
维护一个 0-2^(23-1) 大小的环,服务器节点的 hash 值放到环上,查询时对 key 做 hash 顺时针查找最近的服务器节点。当扩展服务器或者某个服务器节点挂掉时,只影响 hash 值附近的数据,解决余数 hash 的问题。但仍有问题,在服务器数量较少时,缓存数据可能会集中存储到某几台机器,负载不均衡。
使用虚拟节点: hash 环上存 的不是物理机器的 hahs 值,而是虚拟的 hash 节点,一个服务器对应多个均匀分布在环上的虚拟节点。
5.6.2 Redis
6.x 版本一下单线程,多路复用。
支持常用数据结构
5.6.2.1 集群
Redis 集群预分好 16384 个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16385 的值,决定将一个 key 放到哪个桶中。
redis-cluster 把所有的物理节点映射到 [0-16384] slot 上(不一定是平均分配), cluster 负责维护 slot 与服务器的映射关系。
客户端与 Redis 节点直连,客户端不需要链接集群所有节点,连接集群中任何一个可用节点即可。
所有 Redis 节点彼此互联。
6 缓存类型
6.1 通读缓存
缓存服务代理所有流量,客户端只和缓存交互。
6.2 旁路缓存
客户端可以访问数据源,决定是否读取缓存。
7 合理使用缓存
避免缓存频繁修改的数据
避免缓存非热点数据
数据不一致与脏读
缓存雪崩 - 缓存服务崩溃,引必服务器压力大从而不可用
缓存预热
缓存穿透 - 访问的缓存在数据源中不存在,每次请求都会落库。对不存在的 key 值存储为 null,设置失效时间
8 缓存的高可用要求
当把缓存服务器充当一个数据库时,需要保证其可用性。如,使用 Redis 存储用户 Session。
9 LRU
新加入缓存和访问缓存移动到链表头部,清除尾部数据。
版权声明: 本文为 InfoQ 作者【陈皮】的原创文章。
原文链接:【http://xie.infoq.cn/article/8f783ae8826278a26771014fe】。文章转载请联系作者。
评论