搜索全站
性能优化 10 分钟阅读

WordPress 配置 Redis 对象缓存:安装、配置与效果验证

页面缓存解决不了登录用户和动态请求。Redis 对象缓存能缓存数据库查询结果,把 TTFB 再降一截。本文从 Redis 安装、PHP 扩展、插件配置到命中率验证,给出完整落地步骤。

U
UFO_PF 2023-09-29 · 阅读 10 分钟
Wo 性能优化
阅读提示
本文约 3,956 字,预计阅读 10 分钟。文中命令与配置均经过实测,可直接参考执行。

引言:缓存插件都装了,为什么后台还是慢

你可能遇到过这种情况:前台页面已经很快了,但

  • 后台 wp-admin 打开要 3–5 秒;
  • WooCommerce 商品页、购物车页特别慢;
  • 登录用户看前台,完全没有缓存,慢得像没优化过;
  • 站点文章上万后,归档页、搜索页查询卡顿。

原因是:页面缓存只对游客生效。登录用户、带购物车、动态查询的请求,每次都要重新查数据库。而 WordPress 一次页面渲染通常要执行几十到几百条 SQL,其中大量是重复的——比如 wp_options 里的站点配置、文章元数据、菜单结构。

Redis 对象缓存解决的就是这一层:把 WP_Object_Cache 的后端从「内存数组(每次请求结束就丢)」换成「Redis(跨请求持久)」。

原理分析:对象缓存缓存了什么

WordPress 有 wp_cache_set() / wp_cache_get() 这套 API。默认情况下,它用的是 WP_Object_Cache 类的内存实现——数据存在 PHP 数组里,只在单次请求内有效。请求结束,缓存清空,下次请求重新查库。

装上 Redis 后,这些调用被转发到 Redis:

wp_cache_get('alloptions', 'options')
  → 命中 Redis → 直接返回(0.2ms)
  → 未命中 → 查 MySQL → 写入 Redis(下次命中)

最典型的收益是 alloptions。WordPress 启动时会 SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes',一次性加载所有自动加载的配置。站点装了 40 个插件后,这条查询可能返回几百 KB 甚至几 MB 数据,每个请求都执行一次。缓存进 Redis 后,这条查询基本消失。

注意:对象缓存 ≠ 页面缓存。 两者互补:

类型 缓存对象 对谁生效 代表方案
页面缓存 完整 HTML 仅游客 Nginx FastCGI、WP Rocket
对象缓存 数据库查询结果 所有人(含登录) Redis、Memcached
操作码缓存 编译后的 PHP 所有人 OPcache

保姆级实操

第一步:安装 Redis 服务端

# Ubuntu / Debian
sudo apt update && sudo apt install redis-server -y

# CentOS / AlmaLinux
sudo dnf install redis -y && sudo systemctl enable --now redis

第二步:做基本安全加固

编辑 /etc/redis/redis.conf:

bind 127.0.0.1 -::1          # 只监听本机,绝不暴露公网
protected-mode yes
requirepass 你的强密码
maxmemory 256mb              # 按机器内存定,一般 128–512MB 够
maxmemory-policy allkeys-lru # 满了淘汰最少使用的
appendonly no                # 缓存场景不需要持久化

重启并验证:

sudo systemctl restart redis-server
redis-cli -a 你的密码 ping   # 返回 PONG

必做的安全提醒:Redis 未授权访问是最高频的入侵方式之一(挖矿木马)。绝对不要 bind 0.0.0.0 且无密码。

第三步:安装 PHP 扩展

# phpredis(性能好,推荐)
sudo apt install php8.2-redis -y
sudo systemctl restart php8.2-fpm

# 验证
php -m | grep redis

宝塔面板:软件商店 → PHP 设置 → 安装扩展 → Redis。

第四步:装插件并部署 drop-in

安装 Redis Object Cache 插件(Till Krüss 开发,免费)。启用后到「设置 – Redis」:

Object Cache: Enabled
Host: 127.0.0.1
Port: 6379
Password: 你的密码
Database: 0

点 “Enable Object Cache”,插件会尝试把 object-cache.php 复制到 wp-content/。如果提示复制失败,手动操作:

cp wp-content/plugins/redis-cache/includes/object-cache.php \
   wp-content/object-cache.php

第五步:在 wp-config.php 里加配置(推荐)

define( 'WP_REDIS_HOST',     '127.0.0.1' );
define( 'WP_REDIS_PORT',     6379 );
define( 'WP_REDIS_PASSWORD', '你的密码' );
define( 'WP_REDIS_DATABASE', 0 );
define( 'WP_REDIS_TIMEOUT',   1 );
define( 'WP_REDIS_READ_TIMEOUT', 1 );
// 多个站共用一台 Redis 时必须设置,否则数据串站!
define( 'WP_CACHE_KEY_SALT', 'mimangfei_' );
define( 'WP_REDIS_MAXTTL',   86400 );

WP_CACHE_KEY_SALT 非常重要:同一台服务器跑多个 WordPress,如果 key 前缀一样,A 站会读到 B 站的数据,表现为”菜单变成别的站的””设置莫名其妙变了”。

第六步:验证是否真的生效

# 看 Redis 里有没有 key
redis-cli -a 密码 --scan --pattern 'mimangfei_*' | head
redis-cli -a 密码 info keyspace

# 用 WP-CLI 检查
wp redis status
# 看命中率
redis-cli -a 密码 info stats | grep -E "keyspace_hits|keyspace_misses"

命中率计算:hits / (hits + misses),健康值应在 90% 以上。低于 80% 说明配置有问题或缓存被频繁清空。

第七步:命令行验证(可选)

wp eval 'wp_cache_set("t","hello","mmf",60); echo wp_cache_get("t","mmf");'
# 输出 hello 即正常

常见踩坑

  1. 插件显示 “Not connected”:Redis 服务没启动、密码不对、或 PHP 扩展没装。三步排查:redis-cli ping、php -m | grep redis、看 wp-content/object-cache.php 是否存在。
  2. 所有站数据串了:没设 WP_CACHE_KEY_SALT。多站必设。
  3. 更新了文章前台不变:对象缓存有时效,但 wp_options 的 alloptions 缓存可能不主动清。用 wp cache flush 或插件的 “Flush Cache” 按钮。
  4. maxmemory 设太小导致频繁淘汰:命中率上不去。用 redis-cli info memory 看 used_memory_human,按 2 倍设 maxmemory。
  5. 案例:某站开了 Redis 后前台反而更慢了。原因是 Redis 走的是 TCP 连接,而服务器内存紧张导致 Redis 用了 swap。解决:加大内存或把 Redis 改成 unix socket:

php
define( 'WP_REDIS_SCHEME', 'unix' );
define( 'WP_REDIS_PATH', '/var/run/redis/redis-server.sock' );

  1. Redis 挂了站点白屏:对象缓存不可用时,WordPress 会退化到直接查库,不会致命。但如果 timeout 设太大(默认 1 秒),高并发时会堆积。保持默认即可。
  2. 和页面缓存插件冲突:LiteSpeed Cache、W3 Total Cache 自带对象缓存后端,别同时启用两个 object-cache drop-in,会导致 wp-content/object-cache.php 被反复覆盖。

总结

Redis 对象缓存是登录用户和动态页面提速的关键,也是数据库减压最有效的手段。落地要点:Redis 必须 bind 127.0.0.1 + 设密码、PHP 装 phpredis 扩展、wp-config.php 里设 WP_CACHE_KEY_SALT 防串站、上线后看命中率是否 ≥90%。它和页面缓存(如Nginx FastCGI 缓存配置)是叠加关系,不是替代关系。单站点低流量的站收益有限,文章上千、插件几十个、有会员系统的站收益最明显。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。