写点什么

互联网中的缓存

用户头像
陈皮
关注
发布于: 2020 年 07 月 08 日

缓存(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



新加入缓存和访问缓存移动到链表头部,清除尾部数据。



发布于: 2020 年 07 月 08 日阅读数: 59
用户头像

陈皮

关注

还未添加个人签名 2018.04.26 加入

还未添加个人简介

评论

发布
暂无评论
互联网中的缓存