推荐

Discuz! X3.5内部对象缓存(Object Cache Redis Pro)商业级对象缓存增强扩展包[含X5.0功能和OCP高级功能扩展包]

admin 发表于 Discuz!

为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 【开放访问】
为Discuz!X3.5引入Discuz!X5.0 Redis性能和内存缓存加速能力和WP的Object Cache Pro极致性能体验的Discuz! Redis Pro增强扩展 缓存,Discuz,Redis,性能,能力,Discuz,Redis,Discuz,Redis,Discuz,Redis
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引入Discuz!X5.0 Redis性能和内存缓存加速能力和WP的Object Cache Pro极致性能体验的Discuz! Redis Pro增强扩展 缓存,Discuz,Redis,性能,能力,Discuz,Redis,Discuz,Redis,Discuz,Redis
使用方法、说明:【只对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算法扩展,如下图所示安装好:

为Discuz!X3.5引入Discuz!X5.0 Redis性能和内存缓存加速能力和WP的Object Cache Pro极致性能体验的Discuz! Redis Pro增强扩展 缓存,Discuz,Redis,性能,能力,Discuz,Redis,Discuz,Redis,Discuz,Redis
 

宝塔面板Redis软件套接字权限与 FPM 用户组和合理 maxmemory设置:

点开安装之前在软件商店安装好的Redis 8.2.2服务器设置:

合理 maxmemory设置:(一般1~2G足以)


  •  

为Discuz!X3.5引入Discuz!X5.0 Redis性能和内存缓存加速能力和WP的Object Cache Pro极致性能体验的Discuz! Redis Pro增强扩展 缓存,Discuz,Redis,性能,能力,Discuz,Redis,Discuz,Redis,Discuz,Redis

 

配置文件搜索修改:


  •  

搜索:unixsocket /tmp/redis.sock和unixsocketperm,去掉前面 # 号,并把 unixsocketperm 的权限改成770,如下图:

为Discuz!X3.5引入Discuz!X5.0 Redis性能和内存缓存加速能力和WP的Object Cache Pro极致性能体验的Discuz! Redis Pro增强扩展 缓存,Discuz,Redis,性能,能力,Discuz,Redis,Discuz,Redis,Discuz,Redis
 

进阶性能释放:

还是配置文件里面搜索 maxmemory-policy noeviction  ,修改为 maxmemory-policy allkeys-lru ,并去掉前面的  # 号。

allkeys-lru 的优点:

适合通用缓存场景:不需要手动设置 TTL,也能自动清理冷数据。

高效利用内存:保留热点数据,淘汰冷数据,提升命中率。

简单可靠:相比基于 TTL 的策略,不依赖用户是否设置过期时间。


  •  


为Discuz!X3.5引入Discuz!X5.0 Redis性能和内存缓存加速能力和WP的Object Cache Pro极致性能体验的Discuz! Redis Pro增强扩展 缓存,Discuz,Redis,性能,能力,Discuz,Redis,Discuz,Redis,Discuz,Redis

然后需要SSH命令运行:FPM 运行用户加入 redis 组(宝塔常见 www):

 

  1. usermod -aG redis www

复制代码

重启Redis服务器和你的PHP:(也可以宝塔面板里面点重启。)



最后上传扩展包部分:【如果嫌弃上面操作太麻烦,右侧客服QQ手把手远程教学,包教包会!】

步骤一:
 

本帖隐藏的内容

上传或者比对更新下图红框里面的文件:
为Discuz!X3.5引入Discuz!X5.0 Redis性能和内存缓存加速能力和WP的Object Cache Pro极致性能体验的Discuz! Redis Pro增强扩展 缓存,Discuz,Redis,性能,能力,Discuz,Redis,Discuz,Redis,Discuz,Redis



步骤二:
编辑:\config\config_global.php
查找:【约20~25行】
大概如下这样:
为Discuz!X3.5引入Discuz!X5.0 Redis性能和内存缓存加速能力和WP的Object Cache Pro极致性能体验的Discuz! Redis Pro增强扩展 缓存,Discuz,Redis,性能,能力,Discuz,Redis,Discuz,Redis,Discuz,Redis
整段替换为下面高级参数配置:【在提供的增强包里面有“config 参考文件,请勿直接替换你的网站”作为参考配置。】
 

  1. $_config['memory']['redis'] = array(
     
  2.     'server'        => '127.0.0.1',      // Windows 环境用'127.0.0.1'
     
  3.     // 'server'      => 'unix:///tmp/redis.sock', // Linux 线上用'unix:///tmp/redis.sock'
     
  4.     'port'          => 6379,             // Linux 线上 填 0
     
  5.     'pconnect'      => 1,
     
  6.     'requirepass'   => '',
     
  7.     'db'            => 0,
     
  8.  
  9.     'prefix'        => 'dz-x:', // 这里'dz-x:' 注意后面还有英文冒号,替换为你喜欢的命名空间
     
  10.     'max_ttl'       => 86400,
     
  11.     'ttl_jitter'    => 0.10,             // ±10% 抖动
     
  12.         
     
  13.     'prefetch_map' => array(
     
  14.         // 精确匹配 redis_page_type
     
  15.         'forum_index' => array('setting', 'userstats', 'forumstats', 'forums', 'onlinerecord', 'onlinelist', 'heats'),
     
  16.         'forum_viewthread' => array('setting', 'userstats', 'profilesetting', 'medals', 'magics'),
     
  17.  
  18.         'home_space' => array('setting', 'userstats', 'profilesetting'),
     
  19.         'portal_index' => array('setting', 'heats'),
     
  20.  
  21.         // 大类前缀:会在 forum_xxx 回退匹配用
     
  22.         'forum' => array('setting', 'userstats', 'forumstats', 'grouplevels', 'style_default', 'onlinerecord', 'onlinelist'),
     
  23.         'home'   => array('setting', 'userstats', 'grouplevels', 'style_default'),
     
  24.         'portal' => array('setting', 'userstats'),
     
  25.         'plugin' => array('setting', 'userstats'),
     
  26.  
  27.         // 兜底
     
  28.         'generic' => array('setting'),
     
  29.     ),
     
  30.  
  31.     // 按页面类型的动态 TTL(参考 Object Cache Pro 的 maxttl 机制)
     
  32.         'dynamic_ttl_enabled' => 1,
     
  33.         'dynamic_ttl_profile' => array(
     
  34.     // ===== 论坛大类兜底 =====
     
  35.     'forum' => array('min' => 600, 'max' => 3600),   // 10~60 分钟
     
  36.  
  37.     // 首页:读多写少,可略长
     
  38.     'forum_index' => array('min' => 900,  'max' => 3600),   // 15~60 分钟
     
  39.  
  40.     // 板块列表:有新帖,但无需秒级更新
     
  41.     'forum_forumdisplay' => array('min' => 600,  'max' => 2400),  // 10~40 分钟
     
  42.  
  43.     // 帖子详情:回复频率最高,TTL 更短
     
  44.     'forum_viewthread' => array('min' => 300,  'max' => 1800),    // 5~30 分钟
     
  45.  
  46.     // 发帖页面:更偏交互,不建议太长
     
  47.     'forum_post' => array('min' => 120,  'max' => 900),           // 2~15 分钟
     
  48.  
  49.     // ===== Portal 文章 / 专题 =====
     
  50.     'portal'       => array('min' => 900,  'max' => 7200),   // 15 分钟~2 小时
     
  51.     'portal_index' => array('min' => 900,  'max' => 7200),
     
  52.     'portal_list'  => array('min' => 900,  'max' => 7200),
     
  53.     'portal_view'  => array('min' => 1800, 'max' => 10800),  // 30 分钟~3 小时
     
  54.  
  55.     // ===== 家园 / 空间 =====
     
  56.     'home'       => array('min' => 300,  'max' => 1800),
     
  57.     'home_space' => array('min' => 300,  'max' => 1800),
     
  58.  
  59.     // ===== 插件(通用 + 重点插件)=====
     
  60.     // 通用插件:大部分列表/展示型功能,适中 TTL
     
  61.     'plugin' => array('min' => 300,  'max' => 1200),          // 5~20 分钟
     
  62.  
  63.     // 若某个插件页面特别重、又对“实时性”要求不高,可单独拉长:
     
  64.     // 例如 aljlog 列表页
     
  65.     // 'plugin_aljlog' => array('min' => 600, 'max' => 2400),
     
  66.  
  67.     // 若某个插件是“管理/操作面板”,建议短 TTL,避免界面长期不刷新:
     
  68.     // 'plugin_someadmin' => array('min' => 120, 'max' => 600),
     
  69.  
  70.     // ===== 兜底策略 =====
     
  71.     'generic' => array('min' => 0, 'max' => 0),   // 不限制,交给 max_ttl + eviction 兜底
     
  72. ),
     
  73.  
  74.     // —— 编码管线:序列化 + 压缩 ——
     
  75.     'serializer'  => 'auto',
     
  76.     'compression' => 'auto',
     
  77.     //'serializer'    => 'php',   // 或 'igbinary' / 'json' / 'msgpack'
     
  78.     // 'compression' => 'zstd',  // 若不支持 zstd,可尝试 'lz4' 或 'lzf'
     
  79.  
  80.     // —— Redis 连接超时等 ——
     
  81.     'timeout'       => 0.20,
     
  82.     'read_timeout'  => 0.50,
     
  83.  
  84.     // —— Telemetry / SlowLog ——
     
  85.     'stats'             => 1,
     
  86.     'debug'             => 0,
     
  87.     'slowlog_threshold' => 0.05,
     
  88.     'stats_key'         => 'stats:global',
     
  89.  
  90.     // —— OCP 行为增强区 ——
     
  91.     'async_flush'   => 1,                // 映射 OCP async_flush
     
  92.     'group_flush'   => 'scan',           // scan / incremental / keys / full
     
  93.     'prefetch'      => 1,                // 开启批量预取
     
  94.         'prefetch_sample_rate'    => 1.0,
     
  95.     'non_prefetchable_groups' => array(),
     
  96.     'strict'        => 1,                // 默认“宽松模式”
     
  97.         
     
  98.         // Envelope:仅当你确认使用 Phase3 时再打开
     
  99.     'envelope'      => 1,      // 显式启用 Envelope 单对象编码
     
  100.  
  101.     // 集群相关(目前先空着)
     
  102.     'cluster'           => null,
     
  103.     'cluster_failover'  => 'none',
     
  104.  
  105.     // 限流与 WAF
     
  106.     'rate_limit' => array(
     
  107.         'enable' => 1,
     
  108.         'prefix' => 'rl:',
     
  109.     ),
     
  110.  
  111.     'waf' => array(
     
  112.         'enable'       => 1,
     
  113.         'blocklist_key'=> 'waf:block:ip',
     
  114.         'score_prefix' => 'waf:score:',
     
  115.         'score_ttl'    => 3600,
     
  116.     ),
     
  117.         
     
  118.         // 新增配置:允许 Unix Socket 失败时回退到 TCP
     
  119.     'fallback_to_tcp' => 1,
     
  120.     'fallback_host'   => '127.0.0.1',
     
  121.     'fallback_port'   => 6379,
     
  122. );

复制代码

!!!每个配置项都有注释,根据注释替换该替换的!!!


最后,访问 http(s)://你的网站/redis_status.php 【面板后台】
注:【可选操作】
为收紧面板数据查看权限,在 redis_status.php 集成了权限控制说明:
查找:
 

  1. // 访问控制:如需公网/内网访问,可自行放宽或关闭
     
  2. $remote = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
     
  3. $localWhitelist = array('127.0.0.1', '::1');
     
  4.  
  5. // 默认关闭基于 REMOTE_ADDR 的白名单校验,以兼容使用 CDN / 反向代理 的场景;
     
  6. // 如需仅限内网访问,可将 $enableIpWhitelist 调整为 true 并维护 $localWhitelist。
     
  7. $enableIpWhitelist = false;
     
  8. if ($enableIpWhitelist && !in_array($remote, $localWhitelist)) {
     
  9.     header('HTTP/1.1 403 Forbidden');
     
  10.     echo 'Redis Status Panel - Access Denied (REMOTE_ADDR: ' . htmlspecialchars($remote, ENT_QUOTES, 'UTF-8') . ')';
     
  11.     exit;
     
  12. }

复制代码

上面这段请按需修改。
另外,本面板已经考虑了仅允许站点创始人(默认 UID=1)在面板中执行 Flush Cache (内存清理)操作:
查找:
 

  1. // 仅允许站点创始人(默认 UID=1)在面板中执行 Flush Cache 操作
     
  2. $redis_status_can_flush = false;
     
  3. if (!empty($_G['uid'])) {
     
  4.     $allowedFlushUids = array(1);
     
  5.     if (in_array(intval($_G['uid']), $allowedFlushUids, true)) {
     
  6.         $redis_status_can_flush = true;
     
  7.     }
     
  8. }

复制代码

非站点创始人(默认 UID=1)连刷新按钮都不显示:
为Discuz!X3.5引入Discuz!X5.0 Redis性能和内存缓存加速能力和WP的Object Cache Pro极致性能体验的Discuz! Redis Pro增强扩展 缓存,Discuz,Redis,性能,能力,Discuz,Redis,Discuz,Redis,Discuz,Redis

也考虑到了有的站长需要首页统计数据比如:发帖数、会员数等数字的显示要实时不缓存,
预留了控制参数:\source\module\forum\forum_index.php
查找:
 

  1. // 临时禁用论坛首页的内存缓存与访客静态缓存,确保首页统计实时刷新
     
  2. // 如果需要首页发帖数、会员数等统计数实时更新就解除下段注释
     
  3. /*if (isset($_G['setting']['memory']['forumindex'])) {
     
  4.     $_G['setting']['memory']['forumindex'] = null;
     
  5. }
     
  6.  
  7. if (isset($_G['setting']['cacheindexlife'])) {
     
  8.     $_G['setting']['cacheindexlife'] = 0;
     
  9. }*/

复制代码

去掉这段的注释符号即可。
Redis 增强包(基线)v6.zip 附件下载地址:



实测性能演示:
Redis 状态仪表盘:https://www.dz-x.net/redis_status.php 【开放访问】

使用之后效果:DZ插件网2G2H 1M带宽的服务器 访问速度、加载速度、性能发挥得到实质提升。

更多高级技巧及discuz优化建站经验,见群共享更多分享交流:https://jq.qq.com/?_wv=1027&k=xWSYC8tG

评论 (0)

在线聊天