📖 本文共 1,833 字,阅读需要 7 分钟

前言
WordPress 默认每次请求都要查数据库。一个普通页面可能触发 30~100 次 SELECT 查询,每次都是磁盘 I/O。访客一多,MySQL 就成了瓶颈。
本文记录我在 2GB 内存的轻量服务器上搭建双层缓存的过程和原理。
第一层:Redis 对象缓存(减少数据库查询)
原理
WordPress 内部有个 WP_Object_Cache 类,所有数据存取都经过它:
function get_option($option) {
$value = wp_cache_get($option, 'options'); // ← 先查缓存
if ($value === false) {
$value = $db->query("SELECT ..."); // ← 没有才查库
wp_cache_set($option, $value, 'options'); // ← 写入缓存
}
return $value;
}
默认情况:wp_cache_get/set 存在 PHP 进程内存里,请求结束就没了,下个访客重新查库。
装上 Redis 插件后:object-cache.php 替换默认实现,读写目标变成 Redis 内存。
flowchart LR
A[访客请求] --> B[WordPress]
B --> C{Redis 里有吗?}
C -->|✅ 命中 ~95%| D["直接返回 0.1ms"]
C -->|❌ 未命中| E["查 MySQL 2~5ms"]
E --> F["写入 Redis"]
| 默认 | 装上 Redis 后 | |
|---|---|---|
| 存储位置 | PHP 进程内存 | Redis 内存 |
| 生命周期 | 请求结束即销毁 | 持久化,跨请求共享 |
| 跨访客共享 | ❌ | ✅ |
缓存了什么
| 缓存组 | 内容 |
|---|---|
options |
wp_options 表 |
posts |
文章数据 |
users / usermeta |
用户信息 |
terms |
分类/标签 |
site-transient |
瞬态数据 |
安装
wp plugin install redis-cache --activate --path=/www/wwwroot/你的站点 --allow-root
wp redis enable --path=/www/wwwroot/你的站点 --allow-root
第二层:WP Super Cache 页面缓存(跳过 PHP)
原理
Redis 减少了数据库查询,但每次请求仍然要走 PHP → WordPress 完整加载流程。
WP Super Cache 更进一步:把渲染好的 完整 HTML 页面 存成静态文件,下次直接返回,PHP 和 MySQL 都不碰。
Redis 缓存: 问数据库? → 从内存拿(还跑 PHP)
页面缓存: 整页 HTML → 直接返回(PHP 都不跑)⚡
两层配合
flowchart TD
A[访客请求] --> B{Super Cache<br/>有静态 HTML?}
B -->|✅ 有| C["直接返回 HTML<br/>不碰 PHP / MySQL"]
B -->|❌ 没有| D[WordPress 处理]
D --> E{Redis<br/>有缓存数据?}
E -->|✅ 95% 命中| F[内存返回]
E -->|❌ 未命中| G[查 MySQL]
F --> H[渲染 HTML]
G --> H
H --> I[保存到 Super Cache]
I --> C
安装
wp plugin install wp-super-cache --activate --path=/www/wwwroot/你的站点 --allow-root
然后去 WordPress 后台 → 设置 → WP Super Cache → 开启缓存。
我的实际效果
服务器配置:2GB 内存 / CentOS / Nginx / PHP 8.1 / MySQL 5.7 / Redis 7.2
| 指标 | 数据 |
|---|---|
| Redis 命中率 | 95.1%(1.4 亿次命中 / 720 万次未命中) |
| 缓存 Key 数量 | 2,060 个 |
| Redis 内存占用 | 6.12 MB |
| Super Cache 缓存文件 | 3 个页面(持续增长) |
| 首页响应时间 | ~0.3 秒 |
验证命令
# Redis 命中率
redis-cli INFO stats | grep keyspace
# 缓存文件数量
find /www/wwwroot/你的站点/wp-content/cache/ -name '[0-9]*.html' | wc -l
# WP-CLI 查看 Redis 状态
wp redis status --path=/www/wwwroot/你的站点 --allow-root
总结
| 优化手段 | 减少什么 | 效果 |
|---|---|---|
| Redis 对象缓存 | 数据库查询 | 95% 查询走内存 |
| WP Super Cache | PHP 执行 | 整页静态化,直接返回 |
| 两者叠加 | 磁盘 I/O + CPU | 首页 0.3s,省 80%+ 服务器资源 |
轻量服务器跑 WordPress,这两层缓存是最划算的投入——不改代码、不升级硬件,效果立竿见影。
