什么是缓存(Cache)?
缓存是指将访问频率高、获取成本高的数据复制一份,临时存放在读写速度更快的介质中,后续再次请求相同数据时,优先读取缓存,以此提升响应速度、降低系统开销。
就像家里买了 5L 的花生油,可以先倒 500ml 到小油壶里,平时炒菜从小油壶里倒油,效率更高。
缓存的特性
缓存是基于原始数据的副本,是为了提高访问效率而存在的。为了最大程度地提高访问效率,在访问路径的多个环节都有缓存,这些缓存都是临时的,且更新可能存在延时。在需要的时候,我们可以清理所有缓存,这不会影响到原始数据,而且缓存机制会基于原始数据生成新的缓存。
| 对比维度 | 原始数据 (Source Data) | 缓存 (Cache) |
|---|---|---|
| 本质与角色 | 数据的唯一权威来源 | 原始数据的临时副本 |
| 访问效率 | 慢。要层层处理后才能返回结果 | 快,可直接返回结果 |
| 存储位置 | 单一,源服务器或指定位置 | 多样,遍布访问路径的各环节 |
| 生命周期 | 持久化存储,不删除永远存在 | 临时存储,过期或被清理后失效 |
| 数据时效性 | 始终最新,反映当前的真实状态 | 可能滞后,且各节点不统一 |
缓存数据的特性
访问频率高
在 WordPress 外贸网站中,访问频率最高的是各种 HTML 页面,包括网站首页、产品页、文章页等。而请求数量最多的,则是图片、视频、CSS/JS代码、字体等各种静态资源。
获取成本高
每次生成、传输页面都要产生多重成本消耗:
- 生成成本:页面渲染需要占用服务器 CPU、内存、磁盘 IO 资源。
- 带宽成本:完整 HTML、页面内静态资源传输,都会占用服务器出口带宽。
- 距离成本:用户与源服务器距离远,原生直连传输的延迟高。
缓存的生产成本
就像访客会在设备上安装浏览器(如Chrome)以便访问网页,服务器上也会安装 Web 服务(如 Nginx)以便接收访问请求、返回页面数据。
请求抵达源服务器时, Web 服务会直接从固态硬盘中调用图片、代码等静态资源,而 HTML 页面的获取,则涉及多个环节。
HTML页面的获取流程
- Web 服务先读取固态硬盘,有完整的 HTML 页面直接调用,没有则让 WordPress 程序生成。
- WordPress 程序先调用对象缓存,没有缓存的,查询数据库,查询结果存入对象缓存。
- WordPress 程序收集足够多的对象缓存,制作出完整的 HTML 页面,交由 Web 服务发送。
- WordPress 插件把制作好的完整 HTML 页面,缓存到固态硬盘,方便下次调用。
| 类型 | 作用 | 当前主流选择 |
|---|---|---|
| Web 服务 | 接收请求、分发任务、返回页面 | Nginx、Apache、LiteSpeed |
| 建站程序 | 读取数据,渲染成 HTML 页面 | WordPress(PHP) |
| 对象缓存程序 | 缓存数据库查询出来的小块结构化数据 | Redis、Memcached |
| 数据库 | 储存原始数据,接收数据查询指令并返回内容 | MySQL、MariaDB |
| WordPress插件 | 将Wordpress渲染的HTML页面存入固态硬盘 | LiteSpeed Cache |
更多缓存
在Wordpress速度优化中,关于服务器端的缓存,我们最常听到的是
- Page Cache(页面缓存)。就是上面提到的完整的 HTML 页面,储存在固态硬盘中。
- Object Cache(对象缓存)。把数据库查询结果放入内存并备份到固态硬盘,需要时直接调用。
其实,源服务器上还有很多自动生效的缓存,由于不需要我们手动设置,存在感较低,比如:
- 现代 Web 服务缓存。可以生成完整的 HTML 页面;可以把静态文件放入内存。
- Opcode 缓存(PHP 代码缓存)。把 PHP 脚本编译后的操作码缓存至内存,减少重复编译。
- 数据库查询缓存。MySQL、MariaDB自带简易缓存机制,会缓存重复 SQL 查询语句与对应结果。
- 操作系统底层硬件缓存。会把固态硬盘中被频繁读取的内容预加载到内存。
各类硬件读写速度
在网站的源服务器上,缓存按硬件读写速度分层:热点数据放在内存中,方便随时调用;完整数据放在固态硬盘中,保证数据长期稳定保存。
| 硬件 | 速度级别 | 成本 | 容量 | 稳定性 |
|---|---|---|---|---|
| CPU(处理器) | 纳秒级,比内存快10倍 | 极高 | KB~MB | 断电丢失 |
| RAM(内存) | 纳秒级,比NVMe SSD快100倍 | 高 | GB级 | 断电丢失 |
| NVMe SSD(固态硬盘) | 微秒级,比SSD快10倍 | 低 | TB级 | 断电不丢 |
| SSD(固态硬盘) | 毫秒级,1~10ms | 低 | TB级 | 断电不丢 |
- 1 毫秒 = 1,000 微秒 = 1,000,000 纳秒