缓存技术演进

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等)

核心趋势: 从硬件到软件、从单机到分布式、从简单存储到丰富数据结构、从无持久化到有高可用集群。