Caching
什么是缓存?
缓存是一种机制,旨在通过在高速存储层中存储数据子集来减少延迟和计算开销。这使得对该数据的后续请求的处理速度比从其主要(且速度较慢)源获取数据的速度快得多。
现实世界的例子
| 平台 | 使用案例 | 效益 |
|---|---|---|
| 谷歌搜索 | 缓存常见查询的结果(例如“天气”) | 避免为每次搜索重新运行昂贵的排名算法 |
| Netflix | 边缘站点的 CDN(内容交付网络) | 通过从最近的服务器提供视频来最大限度地减少缓冲 |
| X(推特) | 将“热门话题”存储在 Redis 等内存存储中 | 避免实时分析数十亿条推文 |
🌦 缓存 Google 天气数据
此示例演示了用于处理缓慢变化数据的高频请求的**Cache-Aside(延迟加载)**策略。
🛠 工作流程
- 用户请求: 用户搜索“伦敦天气”
- 缓存查找: 后端检查 Redis(内存存储) 是否有键
weather_london- 缓存命中:找到数据→在<1ms内返回
- **缓存未命中:**数据丢失/过期 → 转到步骤 3
- Heavy Lift: 从 外部天气 API(例如 OpenWeather)获取新数据
- 慢(~500ms)
- 每个请求可能会产生费用
- 更新缓存: 将新数据存储在 Redis 中,TTL(生存时间) = 15 分钟
- 响应: 返回天气数据给用户
关键技术概念
- TTL(生存时间): 确保数据过期(例如,防止显示过时的天气)
- 成本优化: 而不是 1,000,000 次 API 调用 → 仅 每 15 分钟 1 次调用(~96/天)
- 高可用性:如果API失败,系统仍然可以提供最后缓存的数据
什么是 CDN?
内容交付网络 (CDN) 是一个全球分布式服务器网络,用于存储内容(视频、图像、静态文件)的缓存副本。
当您点击播放时,数据从最近的服务器传输,而不是遥远的源→更快的加载时间。
案例研究:Netflix 和 CDN
Netflix 使用名为 Open Connect 的自定义 CDN 来高效交付数十亿小时的内容。
运作原理(边缘策略)
- 预测加载: Netflix 预测用户会观看什么并在非高峰时段推送内容
- 本地存储: 在 ISP 数据中心内使用 OCA(开放式连接设备)
- 缩短路径: 从附近的服务器而不是 Netflix 总部传输视频
CDN 缓存的好处
- **低延迟:**减少用户和数据之间的物理距离
- ISP 效率: 保持本地网络内的大量流量
- 高可用性: 自动故障转移到附近的服务器
技术逻辑:自适应比特率缓存
Netflix 将内容缓存在跨多个质量级别的小块中:
| 品质 | 比特率 | 使用案例 |
|---|---|---|
| 4K/超高清 | 高 | 稳定光纤/以太网 |
| 1080p / 高清 | 中等 | 家庭无线网络 |
| 480p/标清 | 低 | 弱网络/移动 |
播放器根据互联网速度动态切换质量(自适应比特率流)
缓存级别
A. 网络层
- CDN: 在边缘服务器上缓存静态资源(图像、视频、JS/CSS)
- DNS 缓存: 浏览器、操作系统和 ISP 缓存 IP 以避免重复查找
CDN 工作
用户访问网站→浏览器发送DNS请求
请求被路由到最近的 PoP(存在点/边缘服务器)
路由依据:
- 地理位置
- 网络延迟
在 PoP 处:
- 缓存命中→快速响应
- 缓存未命中→从源服务器获取
缓存未命中时:
- 从原始服务器获取数据
- 存储在缓存中
- 服务于用户
DNS 工作
域名系统 (DNS) 将域名转换为 IP 地址。
步骤:
浏览器将 DNS 查询 发送到 递归解析器 (ISP)
2.解析器检查本地缓存- 找到→返回IP
如果没有找到:
- 查询根DNS服务器
根 → 返回 TLD 服务器(.com、.org)
解析器 → 查询 TLD 服务器
TLD → 返回权威名称服务器
7.解析器→查询权威服务器→获取实际IP
- 解析器:
- 将IP返回给浏览器
- 缓存结果
B. ⚙ 硬件级别
- CPU 缓存: L1、L2、L3 → CPU 内部超快速访问
- RAM: 主存储器(快速但易失)
| 等级 | 组件 | 速度 | 产能 | 波动性 | 范围 |
|---|---|---|---|---|---|
| L1 缓存 | 1 级 | 最快 | ~64 KB | 挥发性 | 每核心 |
| 二级缓存 | 2 级 | 非常快 | ~256 KB–1 MB | 挥发性 | 每核心 |
| L3 缓存 | 3 级 | 快 | ~2–50 MB | 挥发性 | 共享 |
| 内存 | 主内存 | 中等 | 8–128 GB+ | 挥发性 | 系统 |
| 磁盘/SSD | 存储 | 慢 | 256 GB–10 TB+ | 非挥发性 | 坚持不懈 |
| 网络(网卡) | 外部 | 最慢 | 无限 | 不适用 | 全球 |
后端上下文
技术:
- Redis
- Memcached
- AWS ElastiCache
这些提供:
- 内存存储
- NoSQL 数据库
- 键值存储
缓存策略
1) 惰性缓存(Cache-Aside)
缓存仅在请求数据时发生
流程:
- 请求→检查缓存
- 命中→返回数据
- 未命中→从数据库获取→存储在缓存中→返回
最常用的策略
2) 直写式
数据同时写入缓存+数据库
流程:
- 写操作(POST/PUT/PATCH)
- 一起更新数据库+缓存
好处:
- 缓存始终保持一致且新鲜
3) 驱逐政策
定义缓存如何处理内存限制
为什么需要?
缓存大小有限 → 满时必须删除旧数据
类型:
不驱逐:
缓存已满→新写入失败LRU(最近最少使用):
删除最近最少访问的数据LFU(最不常用):
删除最不常访问的数据基于 TTL:
根据过期时间删除数据
其他见解
何时不使用缓存:
- 高度动态的数据(例如股票价格、实时系统)
- 敏感数据(没有适当的安全控制)
- 低读、高写系统
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 xhj的博客!