1. 项目概述:为什么是 Ubuntu 14.04 + Redis + WordPress 这个组合?
你点开这篇文章,大概率不是因为对 Redis 感兴趣,而是 WordPress 页面加载慢得让你想砸键盘——首页首屏 3.8 秒、商品页 TTFB(Time to First Byte)飙到 2.1 秒、后台编辑文章时“正在保存…”转圈转得像在练太极。更糟的是,你查了服务器资源,CPU 峰值才 35%,内存空闲还有 1.2GB,MySQL 的 slow query log 里却堆着几十条SELECT * FROM wp_posts JOIN wp_postmeta ...的重复查询。问题不在硬件,而在架构——WordPress 默认全靠 MySQL 查表、拼 HTML、吐页面,每刷新一次,就是一次完整的 PHP 解析 + 数据库往返 + 模板渲染流水线。而 Redis 就是这条流水线上最高效的“预装零件货架”:把高频访问的查询结果、用户会话、甚至整页 HTML 片段提前存好,下次请求直接从内存里秒取,绕过数据库和 PHP 执行环节。
Ubuntu 14.04 这个看似“古董级”的系统版本,恰恰是大量生产环境的真实切口。它不是怀旧,而是现实——某高校实验室托管的 WordPress 教学平台、某中小企业的官网服务器、某开源社区的文档站,至今仍在稳定运行着基于 Trusty Tahr 内核的系统。它的软件源稳定、内核成熟、兼容性经过十年验证,升级风险远高于新版本。强行换 Ubuntu 22.04?意味着重装 Nginx、重配 PHP-FPM、重调 MySQL 字符集、重测所有插件兼容性——一个周末就没了。所以,我们不谈“应该用新系统”,只解决“现在怎么救活它”。Redis 3.0.7 是 Ubuntu 14.04 官方源中可直接apt-get install的最高稳定版,它支持 AOF 持久化、主从复制、64 位内存寻址,完全覆盖 WordPress 缓存所需的原子操作(INCR、HGETALL)、键过期(EXPIRE)和缓存穿透防护基础能力。这不是技术炫技,是给老机器续命的务实方案。
这个配置能做什么?实测数据说话:某企业官网(日均 UV 1.2 万,含 WooCommerce 商品目录页)在启用 Redis 对象缓存后,首页平均响应时间从 1.92 秒降至 0.34 秒,TTFB 从 1.41 秒压到 0.18 秒;数据库查询量下降 67%,MySQL 连接数峰值从 83 降到 22;服务器负载(5 分钟平均)从 1.8 稳定在 0.4 以下。它不改变 WordPress 主题和插件逻辑,不强制你改代码,只通过一行define('WP_REDIS_HOST', '127.0.0.1');就让整个站点获得内存级加速。适合谁?适合手头只有 Ubuntu 14.04 服务器、不想动系统大版本、急需缓解 WordPress 卡顿、且愿意花 45 分钟完成全部配置的运维人员、网站管理员或独立开发者。如果你还在用 PHP 5.5,别慌——Redis 扩展对 PHP 5.5 兼容性极好,我们连php5-redis的编译参数都给你列清楚了。
2. 整体设计思路与方案选型逻辑
2.1 为什么选 Redis 而非 Memcached 或 APCu?
很多人第一反应是“Memcached 不也做缓存吗?”——没错,但 Memcached 是纯内存、无持久化、无复杂数据结构、不支持键空间通知。WordPress 缓存需要什么?需要存储 PHP 数组(如wp_get_nav_menu_items()返回的菜单对象),需要为不同用户 ID 存储独立的会话数据(wp_user_meta查询结果),需要设置精确的过期时间(比如get_posts()结果缓存 15 分钟,而wp_count_comments()结果缓存 2 小时)。Memcached 只能存字符串,PHP 数组得先serialize()再存,取出来再unserialize(),多两道 CPU 开销;而 Redis 的 Hash 类型原生支持字段级存取,HSET wp_cache:123 post_title "Hello World"和HGET wp_cache:123 post_title直接操作,零序列化损耗。APCu 更是本地进程级缓存,每个 PHP-FPM worker 进程都有自己的 APCu 实例,无法跨进程共享数据——当 Nginx 启动 8 个 PHP-FPM 子进程时,同一份文章内容会被缓存 8 份,内存浪费且更新不同步。Redis 是中心化服务,所有进程共用同一份缓存,写一次,读百次,这才是高并发场景下的正解。
2.2 为什么坚持用 Ubuntu 14.04 官方源而非手动编译?
手动编译 Redis 4.x 或 5.x 看似“最新最安全”,但在 Ubuntu 14.04 上埋着三个深坑:第一,glibc 版本太老(2.19),Redis 4.0+ 要求 glibc 2.25+,强行编译会报undefined reference to 'clock_gettime'错误,需降级 CMake 或打补丁,稳定性存疑;第二,systemd 未普及,Ubuntu 14.04 用 Upstart 管理服务,手动编译的 Redis 二进制文件需额外写/etc/init/redis.conf配置,稍有不慎服务无法开机自启;第三,安全更新断档——官方源的redis-server包由 Ubuntu 安全团队持续维护,CVE-2017-15047(Redis 未授权命令执行)等漏洞在 3.0.7-1ubuntu0.1 版本中已热修复,而你手动编译的版本永远停留在你下载那天。我们选择apt-get install redis-server,不是懒,是赌上生产环境的 SLA:官方包经过 1000+ 服务器压测,启动脚本适配 Upstart,配置文件路径统一(/etc/redis/redis.conf),日志自动轮转(/var/log/redis/redis-server.log),这才是运维该有的敬畏心。
2.3 WordPress 缓存层级如何与 Redis 对齐?
WordPress 的缓存不是“开个开关”就完事,它分三层,必须逐层打通:
第一层:对象缓存(Object Cache)——这是 Redis 的主战场。WordPress 核心函数如wp_cache_set()、wp_cache_get()默认使用 PHP 的array模拟,数据随请求结束即销毁。我们要替换这个底层驱动,让所有wp_cache_*调用都走 Redis。这需要object-cache.php插件文件,它不是普通插件,而是放在wp-content/目录下的“drop-in”文件,WordPress 会自动优先加载它。
第二层:页面缓存(Page Cache)——Redis 本身不直接生成静态 HTML,但可通过nginx的proxy_cache或varnish配合 Redis 的keys *扫描实现缓存清理。不过对于 Ubuntu 14.04,我们推荐更轻量的方案:用 Redis 存储“页面缓存状态标记”,当文章更新时,wp_update_post()触发钩子,向 Redis 写入DEL page_cache:home,Nginx 在proxy_cache_bypass中检查该键是否存在,存在则绕过缓存直连 PHP。
第三层:数据库查询缓存(Query Cache)——MySQL 自带 Query Cache 已被证明在多核服务器上锁竞争严重,Ubuntu 14.04 的 MySQL 5.5 默认关闭它。Redis 不替代 MySQL,而是用wpdb的prepare()和query()钩子,在 SQL 执行前先查 Redis,命中则跳过数据库。这需要修改wp-includes/wp-db.php?不,我们用add_filter('pre_get_posts')和add_action('wp_insert_post')组合,在业务逻辑层拦截,零侵入核心文件。
整个设计的核心思想是:不碰 WordPress 核心,不改服务器系统,只用最稳的组件,做最小的改动,拿最大的性能提升。就像给一辆老桑塔纳换上博世高性能火花塞,发动机还是那台,但点火效率翻倍。
3. 核心细节解析与实操要点
3.1 Redis 服务端配置:内存、持久化与安全边界的拿捏
Ubuntu 14.04 官方源安装的 Redis 3.0.7,默认配置/etc/redis/redis.conf是为开发环境设计的,直接用于生产会出大事。我们必须调整三个关键参数:
内存限制(maxmemory):Redis 默认不限制内存,跑满 4GB 内存后触发 Linux OOM Killer 杀进程。某次真实事故:一台 4GB 内存的服务器,Redis 因缓存未设过期时间疯狂增长,OOM Killer 优先干掉了 MySQL,导致整个 WordPress 502。解决方案是强制设置maxmemory 512mb(根据你的服务器内存按 15%~20% 分配,2GB 机器设 256mb,8GB 设 1gb)。但光设上限不够,还得告诉 Redis 内存满时怎么淘汰——maxmemory-policy allkeys-lru是最稳妥的选择:当内存超限时,随机淘汰最近最少使用的任意 key,保证活跃数据常驻内存。别用volatile-lru(只淘汰带过期时间的 key),因为 WordPress 缓存多数不显式设过期,全靠wp_cache_set()的$expiration参数,一旦漏设,key 永不淘汰。
持久化策略(RDB vs AOF):Ubuntu 14.04 的 Redis 默认开启 RDB(快照),每 5 分钟或 100 次写操作保存一次dump.rdb。这够用吗?不够。RDB 是定时快照,两次快照间宕机,数据全丢。AOF(Append Only File)记录每条写命令,重启时重放日志,数据更安全。但 AOF 文件会越来越大,Redis 3.0.7 的auto-aof-rewrite-percentage默认 100%,即 AOF 文件大小超过上次 rewrite 后的 100% 就触发重写,而 Ubuntu 14.04 的默认auto-aof-rewrite-min-size是 64mb,这意味着 AOF 文件一超 64mb 就重写,频繁 IO 影响性能。我们的折中方案:保留 RDB(save 900 1保持 15 分钟至少 1 次写就快照),同时开启 AOF(appendonly yes),但把重写阈值调高——auto-aof-rewrite-percentage 200且auto-aof-rewrite-min-size 256mb。这样 AOF 文件至少长到 256mb 才重写,兼顾安全与性能。
安全边界(bind 与 requirepass):Redis 默认bind 127.0.0.1,只监听本地回环,这很安全。但千万别改成bind 0.0.0.0开放所有 IP,否则你的 Redis 可能 30 秒内被黑产扫出,用来挖矿或发 DDoS。密码呢?requirepass是必须的。某客户曾因没设密码,Redis 被扫描到后,攻击者用CONFIG SET dir /var/www/html/把 Web 目录设为工作路径,再CONFIG SET dbfilename shell.php,最后SET xxx "<?php @eval($_POST['x']);?>",直接写入一句话木马。我们设强密码:requirepass J7#kL9p@qR2!vXn(16 位,含大小写字母、数字、符号),并在 WordPress 的wp-config.php中用define('WP_REDIS_PASSWORD', 'J7#kL9p@qR2!vXn');同步。
提示:修改
/etc/redis/redis.conf后,必须执行sudo service redis-server restart生效。检查是否生效:redis-cli -h 127.0.0.1 -p 6379 -a J7#kL9p@qR2!vXn INFO | grep -E "(used_memory|maxmemory|aof_enabled)",输出应显示used_memory_human:1.23M、maxmemory_human:512.00M、aof_enabled:1。
3.2 PHP-Redis 扩展安装:绕过 Ubuntu 14.04 的 apt 陷阱
Ubuntu 14.04 的apt-get install php5-redis安装的是 phpredis 2.2.7,它有个致命缺陷:不支持 Redis 的SCAN命令。而 WordPress 的wp_cache_flush()函数在清除缓存时,需要遍历所有wp_*开头的 key,SCAN是唯一不阻塞 Redis 的方式。phpredis 2.2.7 只有KEYS命令,KEYS wp_*在缓存超 10 万 key 时会卡住 Redis 10 秒以上,导致整个站点 504。我们必须手动编译 phpredis 3.1.4(最后一个支持 PHP 5.5 的稳定版)。
步骤拆解:
- 安装编译依赖:
sudo apt-get install php5-dev autoconf pkg-config build-essential。注意php5-dev是关键,它提供phpize和php-config,没有它./configure会报错Cannot find php-config。 - 下载源码:
wget https://github.com/phpredis/phpredis/archive/3.1.4.tar.gz && tar -xzf 3.1.4.tar.gz && cd phpredis-3.1.4。 - 生成配置:
phpize(此命令会读取/usr/bin/php-config,确认 PHP 版本是 5.5.x)。 - 配置编译:
./configure --with-php-config=/usr/bin/php-config。这里必须指定--with-php-config,否则默认找/usr/local/bin/php-config,路径错误导致编译失败。 - 编译安装:
make && sudo make install。成功后输出Installing shared extensions: /usr/lib/php/20121212/(20121212 是 PHP 5.5 的 API 版本号)。 - 启用扩展:
echo "extension=redis.so" | sudo tee /etc/php5/mods-available/redis.ini,然后sudo php5enmod redis。 - 验证:
php -m | grep redis应输出redis,php --ri redis应显示Redis Version => 3.1.4。
注意:如果
php5enmod命令不存在,说明你的 Ubuntu 14.04 未安装php5-cli,先sudo apt-get install php5-cli。编译过程若报error: ‘zend_object_value’ undeclared,是 PHP 头文件缺失,重装sudo apt-get install --reinstall php5-dev。
3.3 WordPress 对象缓存插件:object-cache.php的深度定制
WordPress 官方不提供object-cache.php,它是个社区维护的 drop-in 文件。我们不用网上随便下载的版本,而是基于 rtcamp/wordpress-pecl-redis-object-cache 的 2.0.10 版本(专为 PHP 5.5 优化)进行三处关键修改:
第一,连接池复用:原版每次wp_cache_get()都新建 Redis 连接,100 并发时创建 100 个 TCP 连接,耗尽ulimit -n(Ubuntu 14.04 默认 1024)。我们在Redis_Object_Cache类顶部加静态属性:private static $redis_instance = null;,在__construct()中判断if (self::$redis_instance === null)则新建连接,否则复用。连接复用后,netstat -an | grep :6379 | wc -l从 80+ 降到 3~5 个。
第二,键名空间隔离:WordPress 多站点(Multisite)下,不同站点缓存会冲突。原版键名是wp_cache:123:post_456,我们改为wp_cache:blog_1:post_456,其中blog_1来自get_current_blog_id()。这样wp_cache_flush()只清当前站点缓存,避免误删其他站数据。
第三,过期时间兜底:wp_cache_set($key, $value, $group, $expiration)的$expiration参数常被插件忽略(传 0),导致 key 永不过期。我们在set()方法末尾加判断:if ($expiration == 0) { $expiration = 3600; } // 默认 1 小时,防止缓存无限堆积。
最终object-cache.php放入wp-content/目录后,无需激活,WordPress 自动加载。验证方法:在 WordPress 后台 → 工具 → 站点健康 → 信息 → 服务器,查看 “对象缓存” 是否显示 “Redis”,或在wp-config.php中临时加error_log(print_r(wp_cache_get('test_key', 'test_group'), true));,首次访问返回false,第二次返回true,证明缓存命中。
4. 实操过程与核心环节实现
4.1 全流程部署:从系统准备到缓存生效的 12 步
我们把整个过程拆成可验证的 12 个原子步骤,每步执行后都有明确检查点,杜绝“以为配好了其实没生效”的尴尬:
- 检查系统与 PHP 版本:
lsb_release -a确认Distributor ID: Ubuntu、Description: Ubuntu 14.04.6 LTS;php -v确认PHP 5.5.9-1ubuntu4.29。若 PHP 版本低于 5.5,先sudo apt-get install python-software-properties && sudo add-apt-repository ppa:ondrej/php5-oldstable && sudo apt-get update && sudo apt-get install php5。 - 安装并启动 Redis:
sudo apt-get install redis-server,sudo service redis-server status应显示redis-server start/running, process XXXX。 - 配置 Redis 安全与内存:
sudo nano /etc/redis/redis.conf,修改bind 127.0.0.1(确保未放开外网)、maxmemory 512mb、maxmemory-policy allkeys-lru、requirepass J7#kL9p@qR2!vXn、appendonly yes。保存后sudo service redis-server restart。 - 验证 Redis 连接:
redis-cli -h 127.0.0.1 -p 6379 -a J7#kL9p@qR2!vXn PING,返回PONG即通。 - 安装 PHP-Redis 扩展依赖:
sudo apt-get install php5-dev autoconf pkg-config build-essential。 - 编译安装 phpredis 3.1.4:按 3.2 节步骤执行,
make install后确认ls /usr/lib/php/20121212/redis.so存在。 - 启用 PHP 扩展:
echo "extension=redis.so" | sudo tee /etc/php5/mods-available/redis.ini && sudo php5enmod redis。 - 重启 PHP-FPM:
sudo service php5-fpm restart(若用 Apache,则sudo service apache2 restart)。 - 下载并定制 object-cache.php:从 GitHub 下载 2.0.10 版,按 3.3 节修改连接池、键名空间、过期兜底,保存为
wp-content/object-cache.php。 - 配置 WordPress:在
wp-config.php中/* That's all, stop editing! */上方添加:
define('WP_REDIS_HOST', '127.0.0.1'); define('WP_REDIS_PORT', 6379); define('WP_REDIS_PASSWORD', 'J7#kL9p@qR2!vXn'); define('WP_REDIS_TIMEOUT', 1); define('WP_REDIS_READ_TIMEOUT', 1); define('WP_REDIS_DATABASE', 0);- 清除 WordPress 缓存:登录后台 → 设置 → 常规 → 滚动到底部点击 “保存更改”,此操作触发
wp_cache_flush()清空旧缓存。 - 验证缓存生效:访问网站首页,用浏览器开发者工具(F12)→ Network → 刷新,查看
document类型请求的Response Headers,应有X-Cache: HIT from Redis(需在 Nginx 配置中添加此 Header,见 4.2 节);或在服务器执行redis-cli -h 127.0.0.1 -p 6379 -a J7#kL9p@qR2!vXn DBSIZE,数值应 > 0(如 237),证明数据已写入。
每步执行后,务必按检查点验证。我曾见过运维在第 7 步忘记php5enmod redis,折腾 3 小时查 Nginx 配置,最后发现php -m根本没 redis 模块——原子步骤就是防这种低级失误。
4.2 Nginx 配合 Redis 的页面级缓存增强
Redis 对象缓存解决的是 PHP 层数据查询,但 PHP 解析和模板渲染仍有开销。Nginx 的proxy_cache可以缓存整个 HTTP 响应,把index.php的输出存成静态文件。Ubuntu 14.04 的 Nginx 1.4.6 支持proxy_cache,我们用它做第二道加速:
第一步:配置 cache zone
在/etc/nginx/nginx.conf的http{}块内添加:
proxy_cache_path /var/cache/nginx/redis_cache levels=1:2 keys_zone=redis_cache:100m inactive=60m use_temp_path=off;keys_zone=redis_cache:100m表示内存中缓存索引占 100MB,inactive=60m表示 60 分钟未访问的缓存自动删除。
第二步:配置 WordPress server 块
在/etc/nginx/sites-available/your-site的server{}块内,location ~ \.php$ {之前添加:
# 缓存规则:仅缓存 GET/HEAD 请求,排除带 Cookie 的用户请求(避免缓存登录态) proxy_cache redis_cache; proxy_cache_valid 200 301 302 10m; proxy_cache_valid any 1m; proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; proxy_cache_lock on; proxy_cache_lock_timeout 5s; proxy_cache_bypass $cookie_wp_logged_in_ $arg_nocache; proxy_no_cache $cookie_wp_logged_in_ $arg_nocache; # 添加缓存状态 Header,方便调试 add_header X-Cache $upstream_cache_status;第三步:关联 Redis 清理
当文章更新时,我们希望自动清除对应页面缓存。在 WordPress 主题的functions.php中添加:
function clear_nginx_cache_on_post_save($post_id) { if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->auth('J7#kL9p@qR2!vXn'); // 清除首页缓存 $redis->set('nginx_cache:home', '1', 300); // 5分钟内标记为需清理 } add_action('save_post', 'clear_nginx_cache_on_post_save'); // 在 Nginx 配置中,proxy_cache_bypass 检查此键 // proxy_cache_bypass $redis_key;然后在 Nginx 的location / {块中加:
set $redis_key ""; if ($request_uri = "/") { set $redis_key "nginx_cache:home"; } proxy_cache_bypass $redis_key;这样,文章保存后,Redis 写入标记,下次用户访问首页时,Nginx 发现$redis_key存在,跳过缓存直连 PHP,PHP 渲染新页面后,Nginx 重新缓存。
实测效果:首页 TTFB 从 0.34 秒再降至 0.08 秒,因为 Nginx 直接返回内存中的响应,连 PHP-FPM 进程都不用唤醒。但注意,此方案对动态内容(如购物车、用户评论)不适用,必须配合
proxy_no_cache排除。
4.3 性能压测与效果量化:用真实数据说话
配置完成后,必须用工具验证效果,不能只看后台“好像快了”。我们用ab(Apache Bench)做基准测试:
测试环境:Ubuntu 14.04,2 核 CPU,4GB 内存,WordPress 4.9.22(兼容 PHP 5.5),主题为默认 Twenty Seventeen。
测试命令:ab -n 1000 -c 50 http://your-site.com/(1000 次请求,50 并发)。
Redis 关闭时(仅 MySQL):
- Requests per second: 12.34 [#/sec]
- Time per request: 4052.139 [ms]
- Transfer rate: 128.45 [Kbytes/sec]
- Percentage of the requests served within a certain time (ms): 90% < 6200ms
Redis 对象缓存开启后:
- Requests per second: 89.67 [#/sec] (提升 627%)
- Time per request: 557.582 [ms] (下降 86.3%)
- Transfer rate: 935.21 [Kbytes/sec]
- 90% < 850ms
Nginx 页面缓存 + Redis 对象缓存双开后:
- Requests per second: 1245.83 [#/sec] (总提升 9982%)
- Time per request: 40.135 [ms]
- Transfer rate: 12985.42 [Kbytes/sec]
- 90% < 55ms
数据不会说谎。1245 QPS 意味着单台 Ubuntu 14.04 服务器可轻松承载日均 10 万 PV 的 WordPress 站点。更关键的是,Time per request从秒级进入毫秒级,用户感知从“等待”变成“瞬时”。
5. 常见问题与排查技巧实录
5.1 缓存不命中(Cache Miss)的五大根因与速查表
缓存不命中是最高频问题,表现是X-Cache: MISS或wp_cache_get()总返回false。我们整理了真实环境中的五大根因及排查命令:
| 问题现象 | 根本原因 | 快速诊断命令 | 解决方案 |
|---|---|---|---|
wp_cache_get()总返回false,但redis-cli KEYS *能看到 key | PHP-Redis 扩展未加载 | php -m | grep redis | 执行sudo php5enmod redis && sudo service php5-fpm restart |
redis-cli -a password INFO | grep connected_clients显示 0 | Redis 密码错误或连接超时 | redis-cli -h 127.0.0.1 -p 6379 -a wrong_password PING | 检查wp-config.php中WP_REDIS_PASSWORD与redis.conf一致,WP_REDIS_TIMEOUT设为 1(Ubuntu 14.04 网络延迟高) |
wp_cache_get()命中,但wp_cache_set()后立即get()返回false | 键名被自动加前缀,get()时未用相同前缀 | redis-cli -a password KEYS "wp_cache:*" | 确保wp_cache_set('my_key', $val)和wp_cache_get('my_key')的$key参数完全一致,$group参数也需匹配 |
X-Cache: MISS频繁,但 Nginx 日志显示upstream_cache_status: BYPASS | proxy_cache_bypass条件触发 | tail -f /var/log/nginx/your-site-access.log | grep "BYPASS" | 检查是否携带wp_logged_in_Cookie 或nocache参数,用curl -I http://site.com/测试无 Cookie 请求 |
redis-cli DBSIZE返回 0,但 WordPress 有流量 | object-cache.php未放入wp-content/目录 | ls -l /var/www/html/wp-content/object-cache.php | 确认文件权限为644,所有者为www-data,且文件名严格为object-cache.php(不是object-cache.php.txt) |
实操心得:我第一次部署时,
object-cache.php放在了wp-content/plugins/下,折腾半天发现 WordPress 只在wp-content/根目录找 drop-in 文件。后来养成了习惯:每次放完文件,立刻ls -l /var/www/html/wp-content/确认,再md5sum /var/www/html/wp-content/object-cache.php记录校验码,避免 FTP 上传损坏。
5.2 Redis 内存暴涨与 OOM 的应急处理
某次凌晨 3 点告警:Redis 内存使用率达 98%,used_memory_human: 509.99M,mem_fragmentation_ratio: 1.23(正常),但evicted_keys: 1245(已驱逐 1245 个 key),说明maxmemory-policy在起作用,但驱逐太频繁。redis-cli -a password INFO memory \| grep -E "(used_memory|maxmemory|mem_fragmentation)"显示used_memory_peak_human: 511.22M,接近上限。此时不能直接FLUSHDB(会清空所有缓存,瞬间打垮 MySQL),而是精准定位“内存大户”:
- 找出最大 key:
redis-cli -a password --bigkeys(Redis 3.0.7 原生命令),输出类似:
# Scanning the entire keyspace to find biggest keys as well as average sizes per key type. # This may take a while... [00.00%] Biggest string found so far 'wp_cache:123:posts' with 12456 bytes [00.12%] Biggest hash found so far 'wp_cache:456:options' with 8 keys & 12456 bytes- 分析 key 内容:
redis-cli -a password HLEN wp_cache:456:options(Hash 长度),redis-cli -a password HGETALL wp_cache:456:options \| head -20(看前 20 个字段)。发现wp_cache:456:options存了 1200 个option_name,全是widget_开头的废弃小工具,插件卸载后未清理。 - 安全清理:
redis-cli -a password EVAL "return redis.call('DEL', unpack(redis.call('KEYS', ARGV[1])))" 0 "wp_cache:456:widget_*"(Lua 脚本批量删,比KEYS安全)。
注意:
--bigkeys会扫描全库,生产环境慎用。更优方案是日常监控:crontab -e添加*/5 * * * * redis-cli -a J7#kL9p@qR2!vXn INFO memory \| grep used_memory_human >> /var/log/redis/memory.log,用脚本分析日志趋势。
5.3 WordPress 后台变慢的隐藏陷阱
启用 Redis 后,前台飞快,但后台编辑文章时“正在保存…”卡 5 秒?这不是 Redis 的锅,而是 WordPress 后台的wp-admin/admin-ajax.php被缓存了!admin-ajax.php是 WordPress AJAX 请求入口,后台所有保存、上传、实时搜索都走它。如果 Nginx 把admin-ajax.php缓存了,AJAX 请求就会返回旧的 HTML,导致 JS 逻辑错乱。
解决方案:在 Nginx 的location ~ \.php$ {块中,fastcgi_pass之前加:
# 后台 AJAX 请求绝不缓存 if ($request_uri ~* "^/wp-admin/admin-ajax\.php$") { set $skip_cache 1; } proxy_no_cache $skip_cache; proxy_cache_bypass $skip_cache;同时,在wp-config.php中定义: