马上注册,免费下载更多dz插件网资源。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
为Discuz!X3.5引入Discuz!X5.0 Redis性能和内存缓存加速能力和具备WP的Object Cache Pro极致性能体验的Discuz! Redis Pro增强扩展包:【2025.12.21 推进更新至 V7.1 极致版本】
熟悉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 等);
在此基础上新增了: Discuz 协作层(memory_driver / discuz_memory) [12.19 v7.0 更新增强]对齐 X5 的 clear/evalscript/prefetch 调用链 Prefetch → RedisProClient::prefetchKeys() 打通 info()/expire() 诊断接口为面板与审计提供能力
Object Cache Pro高级功能特性引入:
1. 高级序列化机制(Auto Serializer)2. 高级压缩(Auto Compression)支持 zstd / lz4 / lzf 自动协商 自动 fallback 多级 Envelope 包装
3. TTL Jitter + max_ttl避免缓存雪崩 兼容 Discuz X3.5 框架行为 参考 OCP maxttl 策略
4. 动态 TTL(Dynamic TTL Profile)5. Prefetch(缓存预取)完整实现重写 RedisProClient::prefetchKeys() 将 prefetched / prefetch_hits 写入 Telemetry 修复 memory_driver_redis::prefetch() 支持 prefetch_map 业务前缀自动匹配 完整打通 Discuz → 内核 → RedisProClient → Redis
6. Group Flush(按业务分组清理)7. Strict Mode协议检查 禁止非序列化数据污染 Redis 缓存 用于保护 OCP 风格缓存一致性
8. Key Layout(Cluster Friendly)9. Telemetry(核心监控体系)10. Redis Dashboard(redis_status.php)11. 兼容 TCP / Unix Socket12. Envelope Telemetry 写入envelope_encoded envelope_decoded envelope_small_bypass envelope_raw_size envelope_final_size
12.15 新增能力:
RedisProClient(OCP 风格核心驱动)Discuz X3.5 内存驱动协作(对齐 X5 思路)12.19 v7.0更新增强:
核心缓存引擎层(RedisProClient)Envelope pipeline(自动序列化/压缩/回退)+ counters(encoded/decoded/bypass/ratio/saved_bytes) Serializer auto(php/igbinary/msgpack)与能力探针 Compression auto(lzf/lz4/zstd)与收益阈值(min_size/min_gain/max_size) TTL 策略体系:ttl_jitter + max_ttl + dynamic_ttl_profile Strict mode(key 规范/误用检测方向) Group flush + async flush(SCAN+DEL + 异步避免阻塞) Cluster-friendly key layout / hash_tag(可扩展到集群) Telemetry + SlowLog(命中/耗时/错误/慢操作)
可观测闭环(redis_status.php + RedisServerStatus)OCP 风格 diagnostics:policy/eviction/capabilities/codec Telemetry 的 stats/stats_derived 口径化输出 Prefetch 验收口径工程化(per_request/effective/skip reason) Realtime Fragments ROI + health/actions(“看见问题→给建议→能收敛”)
全量Redis数据采样后台:https://www.dz-x.net/redis_status.php?format=json [12.19 v7.0版新增]
Realtime Fragments(12.19 v7.0版新增 Discuz-specific 的亮点)LightCache(soft/hard TTL)+ SWR + singleflight + throttle cookie/syscache/db 多源回退 Self-heal(autoflush 后 forumstats 空的“一次性自愈”) ROI 指标采集 + Autotune(尤其 onlinenum)
管理员网站统计计数第三方模板采样数据视角(管理员 UID1 可视数据保护):https://www.dz-x.net/redis_realtime_fragments.php?debug=1 [12.19 v7.0版新增]
Redis 状态面板(OCP Diagnostics 风格)Cron AutoFlush(凌晨 03:00 自动触发)线上观测证据(必须当成验收口径)将以 redis_status.php?format=json 的这些段作为验收口径:[12.19 v7.0版新增 管理员视角 数据中台采样全量数据] 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 版本探针(确认真实环境)
特别注意:
废话也不多说,直接放扩展包,扩展包目录结构如下:[注意:最新v7.0版本根目录的关联辅助文件更多,建议保留上传,config_global.php可以控制安全访问token,不会涉及访问入口数据泄密]
使用方法、说明:【只对Discuz! X3.5版负责,其他DZ版本请自助比对更新使用!!!】
由于设计的文件逻辑比较多,强烈建议使用比对更新的方法进行更新:https://www.dz-x.net/t/161529/1/1.html 【V6.8版本之后基线包已经相当复杂,注意比对!】
前置环境操作:【以宝塔面板为例 😀小技巧:哪怕你不用此基线包,按照此设置了你的宝塔Redis性能也有提升20%】
首先需要理解,宝塔软件商店的 Redis 软件与PHP版本里面的redis扩展两方面区别: 先在宝塔软件商店搜索 Redis 建议安装最新的8.2.3或更新版本的redis服务器,安装好后, 在你discuz使用的实际php版本里面,点开“安装扩展”,先安装好serializer序列化需要的igbinary这个扩展和zstd算法扩展,如下图所示安装好: 宝塔面板Redis软件套接字权限与 FPM 用户组和合理 maxmemory设置:点开安装之前在软件商店安装好的Redis 8.2.3或更新版本的redis服务器设置:
搜索:unixsocket /tmp/redis.sock和unixsocketperm,去掉前面 # 号,并把 unixsocketperm 的权限改成770,如下图:【注意看图操作!】 进阶性能释放: 还是配置文件里面搜索 maxmemory-policy noeviction ,修改为 maxmemory-policy allkeys-lru ,并去掉前面的 # 号。【注意看图操作,右侧QQ客服可以手把手包教包会!】 allkeys-lru 的优点:适合通用缓存场景:不需要手动设置 TTL,也能自动清理冷数据。 高效利用内存:保留热点数据,淘汰冷数据,提升命中率。 简单可靠:相比基于 TTL 的策略,不依赖用户是否设置过期时间。
然后需要SSH命令运行:FPM 运行用户加入 redis 组(宝塔常见 www):[不同linux版本命令不一样,以下为主流Debian Linux 12.x]
重启Redis服务器和你的PHP:(也可以宝塔面板里面点重启。)
最后上传扩展包部分:【如果嫌弃上面操作太麻烦,右侧客服QQ手把手远程教学,包教包会!】
步骤一:
步骤二:
编辑:\config\config_global.php
查找:【约20~25行】
大概如下这样:
整段替换为下面高级参数配置:【在提供的增强包里面有“config 参考文件,请勿直接替换你的网站”作为参考配置。】(2025.12.19 新更新,请同步更新! V6.8版本及后续版本需要比对增加配置!)
[以下是 12.19 v7.x 的全量Redis扩展配置段,理论上低版本Redis扩展包也可以引用不受影响!]
- $_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% 抖动
-
- 'auto_flush' => array(
- 'enable' => 1,
- 'timezone' => 'Asia/Shanghai',
- 'times' => array('03:00'),
- 'window_sec' => 600,
- 'lock_ttl' => 900,
- 'scope' => 'patterns',
- 'patterns' => array(
- '*blockcache_*',
- '*portal_*',
- '*forumdisplay_*',
- ),
- ),
-
- // ====== 实时统计白名单(真正接入 RedisProClient · v2) ======
- // 说明:这里的 'stats_keys' 会被 RedisProClient::normalizeTtlForKey()
- // 识别为“统计类 key”,并应用更短的 stats_ttl(见下)。
- 'stats_ttl' => 15,
- 'stats_keys' => array(
- 'syscache:forumstats',
- 'syscache:userstats',
- 'syscache:forums',
- 'syscache:onlinerecord',
- 'syscache:onlinelist',
- 'syscache:heats',
- ),
-
- // ===== Realtime Fragments / LightCache 核心(统一口径,避免重复覆盖)=====
- 'rtlc_ttl_todayposts_min' => 6,
- 'rtlc_ttl_todayposts_max' => 30,
- 'rtlc_ttl_onlinenum_min' => 300,
- 'rtlc_ttl_onlinenum_max' => 1800,
- 'rtlc_ttl_members_min' => 60,
- 'rtlc_ttl_members_max' => 300,
-
- 'rtlc_soft_ratio' => 0.6,
-
- // hard TTL:控制最坏情况下 DB 回源上限(秒)
- 'rtlc_hard_ttl_todayposts' => 10,
- 'rtlc_hard_ttl_onlinenum' => 300,
- 'rtlc_hard_ttl_members' => 60,
- // stale refresh 概率:降低“集中回源风暴”
- 'rtlc_stale_refresh_p' => 0.10,
- 'rtlc_stale_refresh_p_todayposts' => 0.12,
- 'rtlc_stale_refresh_p_onlinenum' => 0.005,
- // 节流与锁:避免高并发刷新抢锁/打 DB
- 'rtlc_lock_ttl_onlinenum' => 3,
- 'rtlc_throttle_ttl_onlinenum' => 10,
- 'rtlc_throttle_todayposts' => 1,
- 'rtlc_throttle_onlinenum' => 30,
- // 在线人数“展示值”工程化(不改真实 session 逻辑)
- // 在线人数“展示值”工程化(不改真实 session 逻辑)
- // OnlineNum Display(仅展示层,不改真实 session)
- 'rtlc_onlinenum_display_enable' => 1,
- 'rtlc_onlinenum_display_hold_sec' => 7200, // 120分钟:慢更新窗口(hold)
- 'rtlc_onlinenum_display_ttl' => 14400, // 状态Key TTL(默认 hold*2)
- 'rtlc_onlinenum_display_key' => 'stats:rt:onlinenum_display',
- 'rtlc_onlinenum_display_use_as_value' => 1, // 1=前台 onlinenum 用 display;0=仍输出真实值并附带 display 字段
-
- // 如果是独立UC的话,这里请开启,否则请注释下行
- 'rtlc_members_source' => 'uc',
- // Self-heal(autoflush-aware)
- 'rtlc_self_heal_forumstats_enable' => 1,
- 'rtlc_self_heal_after_autoflush_sec' => 900, // 15分钟窗口
- 'rtlc_self_heal_autoflush_key' => 'stats:rt:autoflush:last_run',
- // —— 实时行为增强:附件下载数强制实时更新 ——
- 'realtime_attachment_downloads' => 1,
-
- // 诊断文件调试访问入口token
- 'probe_token' => 'dzx_probe_20251214_xxxxxxxxxxxxx', // 自由定义
- 'diag_token' => 'dzx_probe_20251214_xxxxxxxxxxxxx', // 自由定义
- //'ttl_caps_telemetry' => 1,
- //'ttl_caps_sample' => 0.05,
-
- 'raw_cmd_audit' => 1, // 旁路审计开关
- // ===== B2: no-expire callers 证据链采样(从 bucket -> 调用点闭环)=====
- 'ttl_audit_callers_enable' => 1, // 总开关:是否记录 no-expire 的调用点
- 'ttl_audit_callers_sample' => 0.10, // 采样率:0.05~0.20 建议先 0.10(10%)
- 'ttl_audit_callers_depth' => 18, // 栈深度:10~20 都可,越深越重
- 'ttl_audit_callers_topn' => 20, // 每个 bucket 保留 Top N callers
- 'ttl_audit_callers_ttl' => 86400, // callers 统计 key 的 TTL(建议 1 天滚动)
- 'ttl_audit_callers_ignore' => array(
- 'extend/redis-pro/RedisProClient.php', // 排除自身封装层,避免“只看到自己”
- ),
- 'ttl_audit_callers_max' => 80, // callers_top 最大保留条数(避免面板膨胀)
- 'ttl_audit_callers_stack' => 12, // 栈深(太深噪声大;太浅定位不够)
- 'ttl_audit_callers_min_us' => 0, // 可选:只记录耗时>阈值的写入(先别开)
-
- // 让插件 bucket 的 no-expire 也能自然过期(不靠 flush)[以你自己插件的特征为准,以下是dz插件网安装的插件特征]
- 'bucket_ttl_caps' => array(
- 'boan' => 600, // 1h
- 'keke' => 3600, // 10m(先保守)
- 'addon' => 600, // 10m(先保守)
- 'th' => 600, // 10m(先保守)
- 'lcaddon' => 600, // 10m(先保守)
- 'wq' => 3600, // 1h
- ),
-
- // 下面是我网站插件缓存上限限制,请依据你实际调整
- 'key_ttl_caps' => array(
- 'addon_collect_discuz' => 120, // 2 分钟上限
- 'th_chat' => 60, // 1 分钟上限
- 'lcaddon_newtopic' => 120, // 2 分钟上限
- ),
- // 某些“用户状态类字段”也强制按 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(
- // 暂时留空
- ),
- ),
- 'prefetch_key_stats' => 1,
- 'prefetch_key_sample_rate' => 0.20, // 建议先 0.1~0.3,避免写入过猛
- 'prefetch_key_stats_ttl' => 86400, // 1 天滚动
- // 按页面类型的动态 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_compress_min_size' => 24576, // 24KB 才尝试压缩(比 16KB 更保守)
- 'envelope_compress_min_gain' => 0.03, // 至少节省 3%
- 'envelope_compress_max_size' => 1048576, // 1MB 上限,避免超大对象压缩
- // 集群相关(目前先空着)
- '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,
- );
复制代码
!!!每个配置项都有注释,根据注释替换该替换的!!!【右侧QQ客服支持手把手包教包会!】
最后,访问 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
[2025.12.15 已经更新优化!]
V6.8版本及后续更新需要在后台创建计划任务Discuz 后台 → 工具 → 计划任务: 你也可以按你的业务习惯加第二个时间段(例如 15:00 或 23:30),但建议先只上 03:00,观测 2–3 天再加。 Redis 增强包(基线)v7.1.zip 附件下载地址:【2025.12.21修复更新 由于耗费将近1个多月精力,往后版本如果反响不大,就不再频繁更新了~】
©DZ插件网所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 本站内容为站长个人技术研究记录或网络,不提供用户交互功能,所有内容版权归原作者所有。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,得到更好的正版服务。 您在本站任何的赞助购买、下载、查阅、回复等行为等均表示接受并同意签订《DZ插件网免责声明协议》。 如有侵权请邮件与我们联系处理: discuzaddons@vip.qq.com 并出示相关证明以便删除。敬请谅解!
|