·设为首页收藏本站📧邮箱修改🎁免费下载专区🔐设置/修改密码👽群雄群聊
返回列表 发布新帖

discuz-redis 扩展 轻松快速分页 避免分页瓶颈 (更新DXEXTEND...

520 2
发表于 2022-4-20 15:27:21 | 显示全部楼层 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
discuz-redis 扩展 轻松快速分页 避免分页瓶颈 (更新DXEXTEND框架版)

discuz-redis 扩展 轻松快速分页 避免分页瓶颈 (更新DXEXTEND框架版)

设计原理:
1、起因:
Discuz!X系列中,使用了SELECT * FROM pre_forum_thread WHERE fid=x AND displayorder IN ORDER BY xxx LIMIT x 这样的sql语句获取当前页的主题列表的。主题越多,翻页的数字越大,在mysql中就越容易出现慢查询,影响性能。表中只对回帖时间字段进行了索引,所以当使用发帖时间、回帖数、查看数排序查看翻页的时候,很容易出现慢查询。
由于上述原因,论坛中做了限制翻页的页数。官网上目前是能翻500页,一般论坛默认设置能翻1000页。

2、目标:
在使用redis特性的前提下解决如下2个问题:
1)、支持多种排序模式的翻页,不产生性能问题
2)、不限翻页数量,不产生性能问题。
3)、不会改动和破坏论坛mysql中的数据,实现相互兼容。

3、设计:
在redis中我为每个板块创建了一组sorted set。包括发帖时间集合、回帖时间集合、回帖数集合、浏览数集合。tid为值,排序条件为分数。每次翻页的时候,就在板块的对应集合中取得一组tid。然后再使用SELECT * FROM pre_forum_thread WHERE tid IN () 获取到帖子的其他数据。

(结构如附件图)
另外因为置顶数据的要求,在板块的每组集合中还加了一个一级置顶集合。在整个系统中加了一个fid集合。

4、代码实现:
工具:因为redis数据库需要初始化,所以单独提供了初始化工具
1)、初始化工具php版
2)、初始化工具py版
新增类:
1)、redis底层驱动类
2)、redis类
修改类:
1)、table_forum_thread 类
通过上述新增2个数据库类和修改一个主题表类就能实现设计中的功能。

五、结论:
目前通过测试能达到目标中的三项要求。
1)、四种主题列表排序方式,不管翻页到多少也,速度均在0.0x秒。
2)、在保证性能的前提下,可翻所有页。
3)、和mysql实现无缝兼容。不影响mysql中正式数据,在redis服务未启动的情况下自动切换到老的分页方式。

discuz-redis 扩展 轻松快速分页 避免分页瓶颈 (更新DXEXTEND... 扩展,轻松,快速,分页,避免

一、结构
init_tools 初始化程序
init_php.php
在使用discuz-redis扩展的时候,需要使用上述程序进行初始化redis数据库一次。php版、py版都行。
upload 需要上传到web目录的文件

二、使用前提
1、redis服务器,http://http://redis.io/
2、php-redis扩展,https://github.com/nicolasff/phpredis
3、DXEXTEND1.1.2beta以上,https://www.dismall.com/thread-12045-1-1.html

三、安装步骤
1、上传upload文件夹中的文件到论坛根目录
2、在 config/config_global.php 中增加如下配置
// -----------------------  CONFIG DISCUZ_REDIS  ------------------------ //
$_config['extend']['discuz_redis']['on'] = 1;
$_config['discuz_redis']['server'] = '127.0.0.1';
$_config['discuz_redis']['port'] = 6379;
$_config['discuz_redis']['pconnect'] = 1;
$_config['discuz_redis']['auth'] = '';
$_config['discuz_redis']['db'] = '0';

3、上述配置好后,修改init_php.php文件分别填写:
$mhost = '127.0.0.1'; mysql服务器地址
$muser = 'root'; mysql 用户名
$mpw = '';
mysql密码
$mdb = 'x25redis';
mysql中discuz数据库名
$rhost = '127.0.0.1'; redis地址
$rport = 6379;  redis端口
$_max_num_per_forum = 100000; 此项设置每个板块最多显示多少主题。如服务器内存足够,可填写较大的值,显示所有主题。

4、在服务器上执行init_php.php同步redis数据,例如/usr/local/php/bin/php /usr/local/src/init_php.php
按数据量大小大概遇到几十秒到几分种时间。建议在数据库服务器负载低的时候运行。

5、在Linux服务器上设置计划任务,每天半夜运行一次init_php.php文件保证redis数据同步。时间点可以自定,建议凌晨3点或者4点。

四、关闭与启动
$_config['extend']['discuz_redis']['on'] = 1;  1为启动,0为停止

五、注意事项
1,目前的版本不能和 innodb 插件一起用,这个问题会在下一版本中解决。2,该插件针对大数据大访问量,数据库压力比较大的站点,如果没有性能问题则不建议使用,维护redis需要比较专业的技术。如果盲目使用反而适得其反。
我要说一句 收起回复
一花一世界,一叶一追寻。一曲一场叹,一生为一人。

评论2

bitLv.3 发表于 2022-4-23 21:17:23 | 显示全部楼层
X3.5能用吗?
我要说一句 收起回复
回复

使用道具 举报

bitLv.3 发表于 2022-4-23 21:18:14 | 显示全部楼层
文章中好像有图片好像没有正常加载
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图

您的IP:18.209.63.120,124.238.241.53,GMT+8, 2024-3-28 19:34 , Processed in 0.182846 second(s), 86 queries , Gzip On, Redis On.

Based on Discuz! W1.0 Licensed

© 2001-2024 Discuz! Team.

关灯 快速发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表