为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.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 等);
在此基础上新增了:
[*]prefetch() 统一入口;
[*]userstats 懒重建逻辑;
[*]与 RedisProClient 的动态 TTL / Strict / Telemetry 的协作接口。
Discuz 协作层(memory_driver / discuz_memory)
[*]对齐 X5 的 clear/evalscript/prefetch 调用链
[*]Prefetch → RedisProClient::prefetchKeys() 打通
[*]info()/expire() 诊断接口为面板与审计提供能力
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 风格诊断扩展提供基础
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
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
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 *****
废话也不多说,直接放扩展包,扩展包目录结构如下:[注意:最新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服务器设置:
[*]合理 maxmemory设置:(一般1~2G足以)
[*]配置文件搜索修改:
搜索: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]
usermod -aG redis www重启Redis服务器和你的PHP:(也可以宝塔面板里面点重启。)
最后上传扩展包部分:【如果嫌弃上面操作太麻烦,右侧客服QQ手把手远程教学,包教包会!】
步骤一:
**** Hidden Message *****
步骤二:
编辑:\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
V6.8版本及后续更新需要在后台创建计划任务Discuz 后台 → 工具 → 计划任务:
[*]脚本文件:cron_redis_autoflush.php
[*]执行周期:每天
[*]执行时间:03:00
你也可以按你的业务习惯加第二个时间段(例如 15:00 或 23:30),但建议先只上 03:00,观测 2–3 天再加。Redis 增强包(基线)v7.1.zip 附件下载地址:【2025.12.21修复更新由于耗费将近1个多月精力,往后版本如果反响不大,就不再频繁更新了~】
**** Hidden Message *****
bit 发表于 2025-12-19 23:18
7.0 能不能指定Redis数据库了
指定redis"数据库"在config_global.php的redis配置段的:
'prefix' => 'dz-x:', //dz-x改为你自己的命名空间(随意)在教程中且从一开始版本都已经支持,只是这里叫做命名空间。
体现在 Redis 状态仪表盘 的下图位置(https://www.dz-x.net/redis_status.php):
下一步工程主线
[*]推进 原生命令旁路审计(raw command proxy audit)
[*]覆盖命令:
[*]SET / HSET / PERSIST / EXPIRE
[*]必须在 RedisProClient Proxy 层
[*]绑定:
[*]via
[*]examples
[*]与:
[*]callers
[*]callers_via
[*]cross_index联动
下一阶段子工程(规划)
[*]Redis L7 WAF / CC 防护
[*]score / blocklist / rate-limit
[*]Redis 原子计数
[*]面板可视化
[*]Prefetch optimizer 自动化
[*]caps 建议自动生成 → 人工确认 → 落地
# 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版更新了什么东西