为Discuz!X3.5引入Discuz!X5.0 Redis性能和内存缓存加速能力和具备WP的Object Cache Pro极致性能体验的Discuz! Redis Pro增强扩展:
熟悉WP的都知道:WordPress 默认使用的是“非持久化”的内存缓存(即每次请求结束后缓存就清空)。Object Cache Pro 则通过连接 Redis(或 Memcached)这样的外部缓存服务器,把原本临时的对象缓存变成持久化、跨请求共享的缓存,避免重复查询数据库或执行昂贵的 PHP 操作。 Object Cache Pro 是一款专为 WordPress 设计的高性能、商业级对象缓存插件,主要用于将 WordPress 的内部对象缓存(Object Cache)持久化到 Redis,从而显著提升网站性能和可扩展性。它由付费插件开发商 Rhubarb Group 开发,是 WordPress 官方推荐的高级缓存解决方案之一。
而熟悉X5.0的都知道:X5.0 在 feature() 探测、Lua 脚本、Cluster 等方面对内存驱动做了增强; 所以废话不多说,怎么做到既要WP的Object Cache Pro的高级能力实现又要在X3.5中享受X5.0的内存驱动增强呢: DZ插件网2G2H 1M带宽的服务器实测性能演示: Redis 状态仪表盘:https://www.dz-x.net/redis_status.php 【开放访问】
 DZ插件网独家为站长加速Discuz!网站,发挥极致的Redis性能和内存缓存加速优化,包括今后的实现Redis的L7层CC防御的WAF能力! DZ插件网做出了Redis 增强包(基线)主要实现: 保留了 X3.5 的接口习惯(get/set/getMulti/clear/evalscript 等); 对齐了 X5.0 的能力探测方式(通过 feature() 检测 driver 支持 set/hash/sortedset/cluster/lua/pipeline 等); 在此基础上新增了: prefetch() 统一入口; userstats 懒重建逻辑; 与 RedisProClient 的动态 TTL / Strict / Telemetry 的协作接口。 Object Cache Pro高级功能特性引入: 1. 高级序列化机制(Auto Serializer) php / igbinary / msgpack 自动协商 strict=1 时强制序列化检查 Telemetry 记录序列化时间 2. 高级压缩(Auto Compression) 支持 zstd / lz4 / lzf 自动协商 自动 fallback 多级 Envelope 包装 3. TTL Jitter + max_ttl 避免缓存雪崩 兼容 Discuz X3.5 框架行为 参考 OCP maxttl 策略 4. 动态 TTL(Dynamic TTL Profile) 按页面类型自动确定 TTL 范围 (forum_index / thread / home / portal / plugin / generic) 完整可配置、可观测 5. Prefetch(缓存预取)完整实现 重写 RedisProClient::prefetchKeys() 将 prefetched / prefetch_hits 写入 Telemetry 修复 memory_driver_redis::prefetch() 支持 prefetch_map 业务前缀自动匹配 完整打通 Discuz → 内核 → RedisProClient → Redis 6. Group Flush(按业务分组清理) clearByPattern() 基础能力 async_flush 与 slowlog 机制复用 未来与 UI 面板对接 7. Strict Mode 协议检查 禁止非序列化数据污染 Redis 缓存 用于保护 OCP 风格缓存一致性 8. Key Layout(Cluster Friendly) 避免热点 key 分布不均 hash_tag 兼容 9. Telemetry(核心监控体系) stats:global hash prefetches / prefetch_hits serializer_* 字段 compression_* 字段 envelope_* 字段预留 slowlog_threshold 支持 10. Redis Dashboard(redis_status.php) 可视化: latency hit ratio TTL distribution prefetch 命中率 memory usage eviction policy 诊断(allkeys-lru / volatile-lru) 11. 兼容 TCP / Unix Socket Windows → TCP Linux → unix:///tmp/redis.sock 支持 fallback_to_tcp 12. Envelope Telemetry 写入
envelope_encoded envelope_decoded envelope_small_bypass envelope_raw_size envelope_final_size 本帖隐藏的内容 如果有站长感兴趣,将实现下一阶段进阶功能提升: 1. Hot Path Caching(重点页面热链缓存) 2. Prefetch Map 进一步智能化(按页面轨迹训练权重) 3. Strict Mode Phase 2(禁止错写非序列化数据) 4. Redis Guard 插件 v2(完整后台管理 UI)
查看 key 树 手动 group flush 查看 Telemetry 查看 slowlog WAF score 监控 5. 完整 OCP 级别压缩流水线(LZ4 / ZSTD 更智能的决策)6. 构建 Envelope Pipeline Phase 2(分层压缩 + 检查点)
废话也不多说,直接放扩展包,扩展包目录结构如下:
 使用方法、说明:【只对Discuz! X3.5版负责,其他DZ版本请自助比对更新使用!!!】 由于设计的文件逻辑比较多,强烈建议使用比对更新的方法进行更新:https://www.dz-x.net/t/161529/1/1.html 前置环境操作:【以宝塔面板为例】
首先需要理解,宝塔软件商店的 Redis 软件与PHP版本里面的redis扩展两方面区别: 先在宝塔软件商店搜索 Redis 建议安装最新的8.2.2版本 Redis服务器,安装好后, 在你discuz使用的实际php版本里面,点开“安装扩展”,先安装好serializer序列化需要的igbinary这个扩展和zstd算法扩展,如下图所示安装好: 
宝塔面板Redis软件套接字权限与 FPM 用户组和合理 maxmemory设置: 点开安装之前在软件商店安装好的Redis 8.2.2服务器设置: 合理 maxmemory设置:(一般1~2G足以) 
配置文件搜索修改: 搜索:unixsocket /tmp/redis.sock和unixsocketperm,去掉前面 # 号,并把 unixsocketperm 的权限改成770,如下图: 
进阶性能释放: 还是配置文件里面搜索 maxmemory-policy noeviction ,修改为 maxmemory-policy allkeys-lru ,并去掉前面的 # 号。 allkeys-lru 的优点: 适合通用缓存场景:不需要手动设置 TTL,也能自动清理冷数据。 高效利用内存:保留热点数据,淘汰冷数据,提升命中率。 简单可靠:相比基于 TTL 的策略,不依赖用户是否设置过期时间。

然后需要SSH命令运行:FPM 运行用户加入 redis 组(宝塔常见 www):
- usermod -aG redis www
复制代码 重启Redis服务器和你的PHP:(也可以宝塔面板里面点重启。)
最后上传扩展包部分:【如果嫌弃上面操作太麻烦,右侧客服QQ手把手远程教学,包教包会!】
步骤一: 本帖隐藏的内容上传或者比对更新下图红框里面的文件:

步骤二: 编辑:\config\config_global.php 查找:【约20~25行】 大概如下这样:
 整段替换为下面高级参数配置:【在提供的增强包里面有“config 参考文件,请勿直接替换你的网站”作为参考配置。】
- $_config['memory']['redis'] = array(
- 'server' => '127.0.0.1', // Windows 环境用'127.0.0.1'
- // 'server' => 'unix:///tmp/redis.sock', // Linux 线上用'unix:///tmp/redis.sock'
- 'port' => 6379, // Linux 线上 填 0
- 'pconnect' => 1,
- 'requirepass' => '',
- 'db' => 0,
-
- 'prefix' => 'dz-x:', // 这里'dz-x:' 注意后面还有英文冒号,替换为你喜欢的命名空间
- 'max_ttl' => 86400,
- 'ttl_jitter' => 0.10, // ±10% 抖动
-
- 'prefetch_map' => array(
- // 精确匹配 redis_page_type
- 'forum_index' => array('setting', 'userstats', 'forumstats', 'forums', 'onlinerecord', 'onlinelist', 'heats'),
- 'forum_viewthread' => array('setting', 'userstats', 'profilesetting', 'medals', 'magics'),
-
- 'home_space' => array('setting', 'userstats', 'profilesetting'),
- 'portal_index' => array('setting', 'heats'),
-
- // 大类前缀:会在 forum_xxx 回退匹配用
- 'forum' => array('setting', 'userstats', 'forumstats', 'grouplevels', 'style_default', 'onlinerecord', 'onlinelist'),
- 'home' => array('setting', 'userstats', 'grouplevels', 'style_default'),
- 'portal' => array('setting', 'userstats'),
- 'plugin' => array('setting', 'userstats'),
-
- // 兜底
- 'generic' => array('setting'),
- ),
-
- // 按页面类型的动态 TTL(参考 Object Cache Pro 的 maxttl 机制)
- 'dynamic_ttl_enabled' => 1,
- 'dynamic_ttl_profile' => array(
- // ===== 论坛大类兜底 =====
- 'forum' => array('min' => 600, 'max' => 3600), // 10~60 分钟
-
- // 首页:读多写少,可略长
- 'forum_index' => array('min' => 900, 'max' => 3600), // 15~60 分钟
-
- // 板块列表:有新帖,但无需秒级更新
- 'forum_forumdisplay' => array('min' => 600, 'max' => 2400), // 10~40 分钟
-
- // 帖子详情:回复频率最高,TTL 更短
- 'forum_viewthread' => array('min' => 300, 'max' => 1800), // 5~30 分钟
-
- // 发帖页面:更偏交互,不建议太长
- 'forum_post' => array('min' => 120, 'max' => 900), // 2~15 分钟
-
- // ===== Portal 文章 / 专题 =====
- 'portal' => array('min' => 900, 'max' => 7200), // 15 分钟~2 小时
- 'portal_index' => array('min' => 900, 'max' => 7200),
- 'portal_list' => array('min' => 900, 'max' => 7200),
- 'portal_view' => array('min' => 1800, 'max' => 10800), // 30 分钟~3 小时
-
- // ===== 家园 / 空间 =====
- 'home' => array('min' => 300, 'max' => 1800),
- 'home_space' => array('min' => 300, 'max' => 1800),
-
- // ===== 插件(通用 + 重点插件)=====
- // 通用插件:大部分列表/展示型功能,适中 TTL
- 'plugin' => array('min' => 300, 'max' => 1200), // 5~20 分钟
-
- // 若某个插件页面特别重、又对“实时性”要求不高,可单独拉长:
- // 例如 aljlog 列表页
- // 'plugin_aljlog' => array('min' => 600, 'max' => 2400),
-
- // 若某个插件是“管理/操作面板”,建议短 TTL,避免界面长期不刷新:
- // 'plugin_someadmin' => array('min' => 120, 'max' => 600),
-
- // ===== 兜底策略 =====
- 'generic' => array('min' => 0, 'max' => 0), // 不限制,交给 max_ttl + eviction 兜底
- ),
-
- // —— 编码管线:序列化 + 压缩 ——
- 'serializer' => 'auto',
- 'compression' => 'auto',
- //'serializer' => 'php', // 或 'igbinary' / 'json' / 'msgpack'
- // 'compression' => 'zstd', // 若不支持 zstd,可尝试 'lz4' 或 'lzf'
-
- // —— Redis 连接超时等 ——
- 'timeout' => 0.20,
- 'read_timeout' => 0.50,
-
- // —— Telemetry / SlowLog ——
- 'stats' => 1,
- 'debug' => 0,
- 'slowlog_threshold' => 0.05,
- 'stats_key' => 'stats:global',
-
- // —— OCP 行为增强区 ——
- 'async_flush' => 1, // 映射 OCP async_flush
- 'group_flush' => 'scan', // scan / incremental / keys / full
- 'prefetch' => 1, // 开启批量预取
- 'prefetch_sample_rate' => 1.0,
- 'non_prefetchable_groups' => array(),
- 'strict' => 1, // 默认“宽松模式”
-
- // Envelope:仅当你确认使用 Phase3 时再打开
- 'envelope' => 1, // 显式启用 Envelope 单对象编码
-
- // 集群相关(目前先空着)
- 'cluster' => null,
- 'cluster_failover' => 'none',
-
- // 限流与 WAF
- 'rate_limit' => array(
- 'enable' => 1,
- 'prefix' => 'rl:',
- ),
-
- 'waf' => array(
- 'enable' => 1,
- 'blocklist_key'=> 'waf:block:ip',
- 'score_prefix' => 'waf:score:',
- 'score_ttl' => 3600,
- ),
-
- // 新增配置:允许 Unix Socket 失败时回退到 TCP
- 'fallback_to_tcp' => 1,
- 'fallback_host' => '127.0.0.1',
- 'fallback_port' => 6379,
- );
复制代码 !!!每个配置项都有注释,根据注释替换该替换的!!!
最后,访问 http(s)://你的网站/redis_status.php 【面板后台】 注:【可选操作】 为收紧面板数据查看权限,在 redis_status.php 集成了权限控制说明: 查找: - // 访问控制:如需公网/内网访问,可自行放宽或关闭
- $remote = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
- $localWhitelist = array('127.0.0.1', '::1');
-
- // 默认关闭基于 REMOTE_ADDR 的白名单校验,以兼容使用 CDN / 反向代理 的场景;
- // 如需仅限内网访问,可将 $enableIpWhitelist 调整为 true 并维护 $localWhitelist。
- $enableIpWhitelist = false;
- if ($enableIpWhitelist && !in_array($remote, $localWhitelist)) {
- header('HTTP/1.1 403 Forbidden');
- echo 'Redis Status Panel - Access Denied (REMOTE_ADDR: ' . htmlspecialchars($remote, ENT_QUOTES, 'UTF-8') . ')';
- exit;
- }
复制代码 上面这段请按需修改。 另外,本面板已经考虑了仅允许站点创始人(默认 UID=1)在面板中执行 Flush Cache (内存清理)操作: 查找: - // 仅允许站点创始人(默认 UID=1)在面板中执行 Flush Cache 操作
- $redis_status_can_flush = false;
- if (!empty($_G['uid'])) {
- $allowedFlushUids = array(1);
- if (in_array(intval($_G['uid']), $allowedFlushUids, true)) {
- $redis_status_can_flush = true;
- }
- }
复制代码 非站点创始人(默认 UID=1)连刷新按钮都不显示:

也考虑到了有的站长需要首页统计数据比如:发帖数、会员数等数字的显示要实时不缓存, 预留了控制参数:\source\module\forum\forum_index.php 查找: - // 临时禁用论坛首页的内存缓存与访客静态缓存,确保首页统计实时刷新
- // 如果需要首页发帖数、会员数等统计数实时更新就解除下段注释
- /*if (isset($_G['setting']['memory']['forumindex'])) {
- $_G['setting']['memory']['forumindex'] = null;
- }
-
- if (isset($_G['setting']['cacheindexlife'])) {
- $_G['setting']['cacheindexlife'] = 0;
- }*/
复制代码 去掉这段的注释符号即可。 Redis 增强包(基线)v6.zip 附件下载地址:
实测性能演示: Redis 状态仪表盘:https://www.dz-x.net/redis_status.php 【开放访问】
使用之后效果:DZ插件网2G2H 1M带宽的服务器 访问速度、加载速度、性能发挥得到实质提升。
更多高级技巧及discuz优化建站经验,见群共享更多分享交流:https://jq.qq.com/?_wv=1027&k=xWSYC8tG |