为Discuz!X3.5引入Discuz!X5.0 Redis性能和内存缓存加速能力和WP的Object Cache Pro极致性能体验的Discuz! Redis Pro增强扩展包
为Discuz!X3.5引入Discuz!X5.0 Redis性能和内存缓存加速能力和具备WP的Object Cache Pro极致性能体验的Discuz! Redis Pro增强扩展包:【2025.12.15 推进更新至 V6.8版本】熟悉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
12.15 新增能力:
RedisProClient(OCP 风格核心驱动)
[*]文件:extend/redis-pro/RedisProClient.php
[*]已实现/确认的能力:
[*]TTL 抖动 + max_ttl(normalizeTtl)
[*]Cluster-friendly key layout(hash_tag 兼容)
[*]async_flush、group_flush API
[*]Telemetry(hits/misses/latency/ops 等)
[*]SlowLog(慢操作观测)
[*]本地缓存(减少重复 Redis IO)
[*]TCP + Unix Socket 双模式兼容
[*]clearByPattern($pattern, $limit, $async):SCAN+DEL 批量清理(为 Group Flush UI 预埋)
[*]动态 TTL profile(按 forum/home/portal/plugin/generic 页面类型),开关 dynamic_ttl_enabled
[*]strict=1 时连接级自动选择 serializer/compression(Auto Serializer / Auto Compression Phase)
[*]Envelope pipeline:编码/解码计数、small bypass、raw/final size、压缩收益统计等(逐步对齐 OCP 行为)
Discuz X3.5 内存驱动协作(对齐 X5 思路)
[*]文件:source/class/discuz/discuz_memory.php、source/class/memory/memory_driver_redis.php
[*]已实现:
[*]clear()/evalscript() 协作方式对齐 X5
[*]info()/expire() 诊断与 TTL 接口,为仪表盘与 OCP 风格诊断扩展提供基础
Redis 状态面板(OCP Diagnostics 风格)
[*]文件:redis_status.php、extend/redis_server/RedisServerStatus.php
[*]已实现:
[*]Redis 基础信息、keyspace、memory、policy 探测
[*]codec/capabilities 探针输出(phpredis/igbinary/zstd 等)
[*]Telemetry 可视化:stats / stats_derived(OCP 风格)
[*]Prefetch(Generic) 验收口径与诊断建议:
[*]prefetch_generic_per_request、prefetch_generic_effective
[*]prefetch_generic_skipped_small/capped 汇总诊断
[*]Realtime Fragments ROI 模块:hit/miss/db_rate/p95/refresh_ok 等,并输出可执行建议
[*]时区显示修正(面板时间按 Asia/Shanghai 展示)
Cron AutoFlush(凌晨 03:00 自动触发)
[*]文件:source/include/cron/cron_redis_autoflush.php
[*]已实现/调整方向:
[*]默认从“全量清空”转向“安全 patterns 清理”(避免把 syscache/forumstats 等关键计数缓存打穿后锁死 0)
[*]现在线上 auto_flush scope=patterns,patterns 示例:*blockcache_*, *portal_*, *forumdisplay_*
[*]与 Realtime Self-heal 联动,保证清理后不会锁死在 0
线上观测证据(必须当成验收口径)将以 redis_status.php?format=json 的这些段作为验收口径:
[*]stats:hits/misses/gets/mgets/sets/dels/time_get/time_set、prefetches/prefetch_hits、ttl_samples、envelope_、serializer_、compression_* 等
[*]stats_derived:hit_rate、ops_per_sec、avg_req_ms、prefetch_*_rate、prefetch_generic_per_request、env_compression_ratio、compression_saved_bytes 等
[*]rt_fragments_roi:hit_rate、db_rate_metric、p95_latency_us、refresh_*、health/actions 等
[*]prefetch_key_top:hotmiss/hotaccess/hit 排名(按 group:forum/home/generic…)
[*]codec/capabilities:phpredis/igbinary/zstd 版本探针(确认真实环境)
特别注意:
[*]Prefetch 命中数可能 > prefetches(因为一次 prefetch 包含多个 key),这是预期行为。
[*]Realtime ROI 中 ok>attempt 需 clamp;应修正 refresh_ok 计数逻辑(已在面板口径做 clamp,并提示检查源逻辑)。
**** Hidden Message *****
废话也不多说,直接放扩展包,扩展包目录结构如下:
使用方法、说明:【只对Discuz! X3.5版负责,其他DZ版本请自助比对更新使用!!!】
由于设计的文件逻辑比较多,强烈建议使用比对更新的方法进行更新:https://www.dz-x.net/t/161529/1/1.html【V6.8版本开始基线包已经相当复杂,注意比对!】
前置环境操作:【以宝塔面板为例】
首先需要理解,宝塔软件商店的 Redis 软件与PHP版本里面的redis扩展两方面区别:先在宝塔软件商店搜索 Redis 建议安装最新的8.2.3或更新版本的redis服务器,安装好后,在你discuz使用的实际php版本里面,点开“安装扩展”,先安装好serializer序列化需要的igbinary这个扩展和zstd算法扩展,如下图所示安装好:
宝塔面板Redis软件套接字权限与 FPM 用户组和合理 maxmemory设置:点开安装之前在软件商店安装好的Redis 8.2.3或更新版本的redis服务器设置:
[*]合理 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):[不同linux版本命令不一样,以下为主流Debian Linux 12.x]
usermod -aG redis www重启Redis服务器和你的PHP:(也可以宝塔面板里面点重启。)
最后上传扩展包部分:【如果嫌弃上面操作太麻烦,右侧客服QQ手把手远程教学,包教包会!】
步骤一:
**** Hidden Message *****
步骤二:
编辑:\config\config_global.php
查找:【约20~25行】
大概如下这样:
整段替换为下面高级参数配置:【在提供的增强包里面有“config 参考文件,请勿直接替换你的网站”作为参考配置。】(2025.12.11 新更新,请同步更新!V6.8版本及后续版本需要比对增加配置!)
$_config['memory']['redis'] = array(
'server' => '127.0.0.1', // Windows 环境使用
// 'server' => 'unix:///tmp/redis.sock', // Linux 环境使用
'port' => 6379, // Linux 环境 填 0
'pconnect' => 1,
'requirepass' => '',
'db' => 0,
'prefix' => 'dz-x:', //dz-x改为你自己的命名空间(随意)
'max_ttl' => 86400,
'ttl_jitter' => 0.10, // ±10% 抖动
// ====== 实时统计白名单(策略声明 v1) ======
'realtime_syscaches' => array(
'forumstats', // 今日/昨日/总帖
'userstats', // 会员/新会员
'historyposts', // 历史总发帖(如有)
'onlinerecord', // 历史在线记录
'onlinelist', // 当前在线用户列表
),
// —— 实时行为增强:附件下载数强制实时更新 ——
'realtime_attachment_downloads' => 1,
// 某些“用户状态类字段”也强制按 DB 为准(已经在 _init_session 里实现)
'realtime_user_fields' => array(
'invisible',
// 后续如果有需要可以加:'groupid', 'accessmasks' 等
),
'prefetch_map' => array(
// ====== 论坛部分(保持你当前的,略) ======
'forum_index' => array('setting', 'userstats', 'forumstats', 'forums', 'onlinerecord', 'onlinelist', 'heats'),
'forum_viewthread' => array('setting', 'userstats', 'profilesetting', 'medals', 'magics'),
'forum' => array('setting', 'userstats', 'forumstats', 'grouplevels', 'style_default', 'onlinerecord', 'onlinelist'),
// ====== Portal 部分:增加 portalcategory 等结构性缓存 ======
'portal_index' => array(
'setting',
'userstats',
'portalcategory',// 频道/栏目结构
'heats',
),
'portal' => array(
'setting',
'userstats',
'portalcategory',
),
// ====== 插件页:至少预取 setting / userstats,减少 DB 重复访问 ======
'plugin' => array(
'setting',
'userstats',
// 将来如果某个插件有自己的 syscache,我们再按插件名扩展
),
// ====== generic:先关闭或极简化(见上) ======
'generic' => array(
// 暂时留空
),
),
// 按页面类型的动态 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' => 1200, 'max' => 7200), // 20 分钟~2 小时
'portal_list'=> array('min' => 1200, 'max' => 7200),
'portal_view'=> array('min' => 1800, 'max' => 14400),// 30 分钟~4 小时
// ===== 家园 / 空间 =====
'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
V6.8版本及后续更新需要在后台创建计划任务Discuz 后台 → 工具 → 计划任务:
[*]脚本文件:cron_redis_autoflush.php
[*]执行周期:每天
[*]执行时间:03:00
你也可以按你的业务习惯加第二个时间段(例如 15:00 或 23:30),但建议先只上 03:00,观测 2–3 天再加。
Redis 增强包(基线)v6.8.zip 附件下载地址:【2025.12.15更新】
**** Hidden Message *****
# Discuz! Redis Pro 增强扩展 - X3.5 性能加速方案
## 核心特性概述
本扩展为 Discuz! X3.5 引入 X5.0 的 Redis 性能增强能力,并融合 WordPress Object Cache Pro 的极致性能体验,打造 Discuz! Redis Pro 增强扩展。
## 技术架构亮点
### 1. 兼容性设计
- 保留 X3.5 原生接口习惯(get/set/getMulti/clear/evalscript)
- 对齐 X5.0 能力探测机制(feature() 检测驱动支持)
- 新增 prefetch() 统一入口和 userstats 懒重建逻辑
### 2. Object Cache Pro 高级特性移植
#### 序列化机制
- 自动协商:php / igbinary / msgpack
- 严格模式下的序列化检查
- Telemetry 序列化时间记录
#### 智能压缩
- 支持 zstd / lz4 / lzf 自动协商
- 自动降级机制
- 多级 Envelope 包装
#### TTL 优化
- TTL Jitter 避免缓存雪崩
- max_ttl 策略兼容 X3.5 框架
- 参考 OCP 最大 TTL 策略
#### 动态 TTL 配置
- 按页面类型自动适配 TTL
- 支持 forum_index / thread / home / portal / plugin / generic
- 完整可配置和可观测
### 3. 预取机制完整实现
- 重写 RedisProClient::prefetchKeys()
- Telemetry 记录预取命中率
- 修复 memory_driver_redis::prefetch()
- 支持 prefetch_map 业务前缀自动匹配
### 4. 分组清理功能
- clearByPattern() 基础能力
- 异步清理与慢日志机制复用
- 未来支持后台管理面板对接
### 5. 严格模式保护
- 协议检查机制
- 防止非序列化数据污染 Redis
- 确保 OCP 风格缓存一致性
### 6. 集群友好设计
- 避免热点 Key 分布不均
- hash_tag 兼容性支持
### 7. 监控体系
- stats:global 哈希统计
- 预取命中率监控
- 序列化/压缩性能指标
- 慢日志阈值支持
### 8. Redis 状态仪表盘
可视化监控面板包含:
- 延迟分析
- 命中率统计
- TTL 分布情况
- 预取命中率
- 内存使用情况
- 淘汰策略诊断
### 9. 连接协议支持
- Windows 环境:TCP 连接
- Linux 环境:Unix Socket
- 支持 TCP 回退机制
## 安装部署指南
### 步骤一:文件更新
强烈建议使用比对更新方式,参考教程:
down.dz-x.net/t/161529/1/1.html
需要更新的核心文件包括:
- 内存驱动相关文件
- Redis 客户端组件
- 配置管理文件
### 步骤二:配置调整
编辑 config/config_global.php 文件(约20-25行)
**重要提示**:请勿直接替换现有配置,参考增强包中的配置文件进行比对更新。
## 进阶功能规划
### 下一阶段开发重点
1. **热点路径缓存** - 重点页面热链优化
2. **智能预取映射** - 基于页面访问轨迹的权重训练
3. **严格模式第二阶段** - 防止非序列化数据写入
4. **Redis Guard 插件 v2** - 完整后台管理界面
- Key 树状查看
- 手动分组清理
- Telemetry 数据查看
- 慢日志分析
- WAF 评分监控
5. **完整压缩流水线** - LZ4 / ZSTD 智能决策
6. **Envelope Pipeline 第二阶段** - 分层压缩与检查点
## 版本兼容性说明
**仅支持 Discuz! X3.5 版本**
其他 Discuz! 版本请自行比对文件差异后使用
## 技术支持与资源
- 官方文档:open.dismall.com/?ac=document&page=dev_coderule
- 插件开发指南:open.dismall.com/?ac=document&page=dev_plugin
- 模板开发:open.dismall.com/?ac=document&page=dev_template
- X5.0 开发索引:open.dismall.com/?ac=document&page=dev_x5_index
## 性能优化建议
1. 根据站点规模调整 TTL 策略
2. 启用压缩功能减少内存占用
3. 合理配置预取映射提升命中率
4. 定期监控 Telemetry 数据优化配置
## 安全注意事项
- 确保 Redis 服务仅限内网访问
- 定期更新安全补丁
- 监控异常访问模式
- 启用严格模式防止数据污染
---
**DZ插件网** 持续为 Discuz! 站长提供性能优化解决方案,发挥 Redis 极致性能,打造高速稳定的社区平台。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 我就说吗最近Dz-x插件网的访问速度上来了
原来是用了新东西! 厉害,学习了刚好用上 看下,谢谢 看看能不能指定 Redis 缓存数据库呢
在config中指定了数据为 1 实际还是用的DB0 感谢分享,正需要 看看怎么弄 感谢分享 6.2版更新了什么东西
页:
[1]
2