discuz-redis 扩展 轻松快速分页 避免分页瓶颈 (更新DXEXTEND...
discuz-redis 扩展 轻松快速分页 避免分页瓶颈 (更新DXEXTEND框架版)<br /><br /><font size="4"><strong>discuz-redis 扩展 轻松快速分页 避免分页瓶颈 (更新DXEXTEND框架版)</strong></font><br /><br /><strong>设计原理:</strong><br /><p style="line-height:25px;text-indent:nullem;text-align:left"><font color="#000">1、起因:<br />Discuz!X系列中,使用了SELECT * FROM pre_forum_thread WHERE fid=x AND displayorder IN ORDER BY xxx LIMIT x 这样的sql语句获取当前页的主题列表的。主题越多,翻页的数字越大,在mysql中就越容易出现慢查询,影响性能。表中只对回帖时间字段进行了索引,所以当使用发帖时间、回帖数、查看数排序查看翻页的时候,很容易出现慢查询。<br />由于上述原因,论坛中做了限制翻页的页数。官网上目前是能翻500页,一般论坛默认设置能翻1000页。<br /><br />2、目标:<br />在使用redis特性的前提下解决如下2个问题:<br />1)、支持多种排序模式的翻页,不产生性能问题<br />2)、不限翻页数量,不产生性能问题。<br />3)、不会改动和破坏论坛mysql中的数据,实现相互兼容。<br /><br />3、设计:<br />在redis中我为每个板块创建了一组sorted set。包括发帖时间集合、回帖时间集合、回帖数集合、浏览数集合。tid为值,排序条件为分数。每次翻页的时候,就在板块的对应集合中取得一组tid。然后再使用SELECT * FROM pre_forum_thread WHERE tid IN () 获取到帖子的其他数据。</font></p><p style="line-height:25px;text-indent:nullem;text-align:left"><font color="#000">(结构如附件图)</font></p><p style="line-height:25px;text-indent:nullem;text-align:left"><font color="#000">另外因为置顶数据的要求,在板块的每组集合中还加了一个一级置顶集合。在整个系统中加了一个fid集合。<br /><br />4、代码实现:<br />工具:因为redis数据库需要初始化,所以单独提供了初始化工具<br />1)、初始化工具php版<br />2)、初始化工具py版<br />新增类:<br />1)、redis底层驱动类<br />2)、redis类<br />修改类:<br />1)、table_forum_thread 类<br />通过上述新增2个数据库类和修改一个主题表类就能实现设计中的功能。<br /><br />五、结论:<br />目前通过测试能达到目标中的三项要求。<br />1)、四种主题列表排序方式,不管翻页到多少也,速度均在0.0x秒。<br />2)、在保证性能的前提下,可翻所有页。<br />3)、和mysql实现无缝兼容。不影响mysql中正式数据,在redis服务未启动的情况下自动切换到老的分页方式。</font></p><font color="#000"><img id="aimg_Jw0Wl" onclick="zoom(this, this.src, 0, 0, 0)" class="zoom" src="http://att.discuz.net/data/attachment/album/201307/04/092812auuouu4ffiifii6i.jpg" onmouseover="img_onmouseoverfunc(this)" lazyloadthumb="1" border="0" alt="" /></font><br /><br /><strong>一、结构</strong><br />init_tools 初始化程序<br />init_php.php<br /> 在使用discuz-redis扩展的时候,需要使用上述程序进行初始化redis数据库一次。php版、py版都行。<br />upload 需要上传到web目录的文件<br /><br /><strong>二、使用前提</strong><br />1、redis服务器,http://http://redis.io/<br />2、php-redis扩展,https://github.com/nicolasff/phpredis<br />3、<i>DXEXTEND1.1.2beta以上,https://www.dismall.com/thread-12045-1-1.html</i><br /><br /><strong>三、安装步骤</strong><br />1、上传upload文件夹中的文件到论坛根目录<br />2、在 config/config_global.php 中增加如下配置<br />// ----------------------- CONFIG DISCUZ_REDIS ------------------------ //<br />$_config['extend']['discuz_redis']['on'] = 1;<br />$_config['discuz_redis']['server'] = '127.0.0.1';<br />$_config['discuz_redis']['port'] = 6379;<br />$_config['discuz_redis']['pconnect'] = 1;<br />$_config['discuz_redis']['auth'] = '';<br />$_config['discuz_redis']['db'] = '0';<br /><br />3、上述配置好后,修改init_php.php文件分别填写:<br />$mhost = '127.0.0.1'; mysql服务器地址<br />$muser = 'root'; mysql 用户名<br />$mpw = '';<br />mysql密码<br />$mdb = 'x25redis';<br />mysql中discuz数据库名<br />$rhost = '127.0.0.1'; redis地址<br />$rport = 6379; redis端口<br />$_max_num_per_forum = 100000; 此项设置每个板块最多显示多少主题。如服务器内存足够,可填写较大的值,显示所有主题。<br /><br />4、在服务器上执行init_php.php同步redis数据,例如/usr/local/php/bin/php /usr/local/src/init_php.php<br />按数据量大小大概遇到几十秒到几分种时间。建议在数据库服务器负载低的时候运行。<br /><br />5、在Linux服务器上设置计划任务,每天半夜运行一次init_php.php文件保证redis数据同步。时间点可以自定,建议凌晨3点或者4点。<br /><br /><strong>四、关闭与启动<br /></strong>$_config['extend']['discuz_redis']['on'] = 1; 1为启动,0为停止<br /><br /><strong>五、注意事项</strong><br /><strong><font color="#ff0000">1,目前的版本不能和 innodb 插件一起用,这个问题会在下一版本中解决。</font></strong><strong><font color="#ff0000">2,该插件针对大数据大访问量,数据库压力比较大的站点,如果没有性能问题则不建议使用,维护redis需要比较专业的技术。如果盲目使用反而适得其反。<br /></font></strong><br /><ignore_js_op><span style="white-space: nowrap" id="attach_14655" onmouseover="showMenu({'ctrlid':this.id,'pos':'12'})">discuz-redis-dxextend.zip<em class="xg1">(7.93 KB, 下载次数: 969)</em></span>2022-4-20 15:14 上传点击文件名下载附件</ignore_js_op><br /><br />redis<em>, </em>config<em>, </em>mysql<em>, </em>使用<em>, </em>数据 这个框架老早发布的,不知道X3.5还能用吗? <br /><br />刚开始我还以为技术新帖,心情澎湃的看完贴子后,返回列表发现一堆同类坟贴,不应该叫坟贴了,应该是考古级别尘封的历史,向前追溯的历史源远流长,管理大大正在锲而不舍的尝试发掘此版块文献记载,考古帖的发表逐渐酝酿中……楼主深刻领略越是远古越值钱,破旧的古董远比精美的现代物更有价值,楼主领略了真谛,并且带到了帖子当中,管理大大此版帖子古朴信息迎面而来,让我仿佛看见华夏五千年的历史沧桑<br /><br />看了看管理大大此版块的其它帖子,有着新时代的我们,有些欣欣向荣的憧憬看到帖子瞬间感到三花聚顶,追忆大唐<br />-----<br />虽是调侃却无嘲讽之意,也无一字复制,全部手写,管理大大手下留情啊<br /> 直接用云数据库redis 可以吗 <br />在 config/config_global.php 直接配置云数据库 redisd 内网IP和密码 <br /><br /> 这样就可以用云数据库了 可以缓解压力 <br /><br />请问这样可以吗 <br />dz原本应该就能用吧
頁:
[1]