缓存技术演进
1.缓存的本质
缓存是为了调节速度不一致的介质之间的速度差,置于中间实现速度较快的一方加速访问速度较慢的一方。
典型例子:CPU缓存加速访问内存、内存加速访问硬盘、Raid Cache加速磁盘IO。
2.缓存的分层架构
用户层 ──────────────── 浏览器DNS缓存、应用程序DNS缓存、操作系统DNS缓存
│
代理层 ──────────────── CDN缓存、反向代理缓存(Nginx)
│
Web层 ──────────────── 解释器Opcache、Web服务器缓存
│
应用层 ──────────────── 页面静态化(动态→静态HTML)
│
数据层 ──────────────── 分布式缓存(Redis/Memcached)、数据库查询缓存
│
系统层 ──────────────── 操作系统cache/buffer
│
物理层 ──────────────── 磁盘Cache、Raid Cache
Buffer vs Cache: Buffer用于写缓冲(先存内存后写磁盘),Cache用于读缓存(加速频繁读取的数据)
3.用户层缓存演进
1. DNS缓存
- 浏览器DNS缓存默认60秒,60秒内访问同一域名不再重新解析
- HTML5新增
dns-prefetch预取技术,提前解析域名
2. 浏览器缓存机制(HTTP缓存)
| 机制 | 原理 | 特点 |
|---|---|---|
| Last-Modified | 服务器记录资源最后修改时间,客户端下次请求带 If-Modified-Since |
仍需发请求,精度到秒 |
| Etag | 服务器生成资源唯一标识,客户端带 If-None-Match |
更精确,但多服务器需保持一致 |
| Expires | 响应头直接指定过期时间 | 依赖本地时钟,可能有偏差 |
| Cache-Control | 更灵活的过期控制(max-age等) | 优先于Expires |
混合使用顺序:
先判断 Expires → 未过期则直接用缓存
↓ 已过期
发HTTP请求 → 判断 Last-Modified → 未变则返回304
↓ 已变
判断 Etag → 未变则返回304
↓ 已变
返回200 + 新资源
刷新行为:
| 操作 | 效果 |
|---|---|
| 首次访问 | 获取最新数据,返回200 |
| 点击刷新(F5) | 发请求协商缓存,Last-Modified/Etag生效 |
| 强制刷新(Ctrl+F5) | 忽略所有缓存,直连服务器 |
4.CDN缓存
问题: 用户与源站物理距离远、跨运营商转发延迟高、源站带宽瓶颈
解决方案: 将源站资源缓存到全国各地边缘节点,用户就近获取
调度流程:
用户请求 → Local DNS → GSLB智能调度 → 最优边缘节点IP
↓
有缓存?→ 直接返回
↓ 无缓存
回源站获取 → 缓存到节点 → 返回给用户
302重定向优化: 解决DNS调度失效/生效慢问题,实时决策最优节点
分层缓存策略:
| 热度级别 | 存储介质 | 数据空间 |
|---|---|---|
| 高(40%-90%) | 内存Cache | 8G-64G |
| 中(30%-50%) | SSD/SATA | 1T-15T |
| 低(冷数据) | 云存储 | 回源拉取 |
5.应用层缓存
| 技术 | 说明 |
|---|---|
| Opcache | PHP/Java等解释型语言的字节码缓存 |
| 页面静态化 | 动态页面提前生成静态HTML文件 |
| Web服务器缓存 | Nginx proxy_cache等 |
注意: 代码上线后字节码可能未更新,部署前需清理缓存
6.数据层缓存
核心产品对比:
| 特性 | Redis | Memcached |
|---|---|---|
| 数据类型 | String/List/Set/ZSet/Hash | 仅String |
| 持久化 | RDB + AOF | 无 |
| 单机并发 | 数万级(单线程) | 多线程并发 |
| 分布式 | Redis Cluster | 客户端分片 |
| 最大Value | 512MB(建议<2MB) | 1MB |
| 功能 | Lua脚本/PubSub/事务/Pipeline | 简单get/set |
Redis 6.0变化: 引入网络IO多线程,但命令执行仍是单线程
7.Redis 典型应用场景
Session共享 ──── Web集群多服务器会话一致
│
缓存 ──────── 数据查询、商品信息、新闻内容
│
计数器 ────── 排行榜、浏览数统计
│
社交场景 ──── 共同好友、粉丝数、关注、点赞评论
│
消息队列 ──── ELK日志缓存、订阅发布系统
│
地理位置 ──── 摇一摇、附近的人、外卖定位
8.演进总结
CPU缓存(硬件)
↓
内存Cache/Buffer(操作系统层)
↓
DNS缓存 + 浏览器HTTP缓存(用户层)
↓
CDN缓存(边缘加速层)
↓
Web层Opcache + 页面静态化(应用层)
↓
Redis/Memcached(分布式数据层)
↓
数据库查询缓存(InnoDB Buffer Pool等)
核心趋势: 从硬件到软件、从单机到分布式、从简单存储到丰富数据结构、从无持久化到有高可用集群。