discuz-redis 擴(kuò)展 輕松快速分頁 避免分頁瓶頸 (更新DXEXTEND框架版)
discuz-redis 擴(kuò)展 輕松快速分頁 避免分頁瓶頸 (更新DXEXTEND框架版)
設(shè)計(jì)原理:
1、起因:
Discuz!X系列中,使用了SELECT * FROM pre_forum_thread WHERE fid=x AND displayorder IN ORDER BY xxx LIMIT x 這樣的sql語句獲取當(dāng)前頁的主題列表的。主題越多,翻頁的數(shù)字越大,在mysql中就越容易出現(xiàn)慢查詢,影響性能。表中只對(duì)回帖時(shí)間字段進(jìn)行了索引,所以當(dāng)使用發(fā)帖時(shí)間、回帖數(shù)、查看數(shù)排序查看翻頁的時(shí)候,很容易出現(xiàn)慢查詢。
由于上述原因,論壇中做了限制翻頁的頁數(shù)。官網(wǎng)上目前是能翻500頁,一般論壇默認(rèn)設(shè)置能翻1000頁。
2、目標(biāo):
在使用redis特性的前提下解決如下2個(gè)問題:
1)、支持多種排序模式的翻頁,不產(chǎn)生性能問題
2)、不限翻頁數(shù)量,不產(chǎn)生性能問題。
3)、不會(huì)改動(dòng)和破壞論壇mysql中的數(shù)據(jù),實(shí)現(xiàn)相互兼容。
3、設(shè)計(jì):
在redis中我為每個(gè)板塊創(chuàng)建了一組sorted set。包括發(fā)帖時(shí)間集合、回帖時(shí)間集合、回帖數(shù)集合、瀏覽數(shù)集合。tid為值,排序條件為分?jǐn)?shù)。每次翻頁的時(shí)候,就在板塊的對(duì)應(yīng)集合中取得一組tid。然后再使用SELECT * FROM pre_forum_thread WHERE tid IN () 獲取到帖子的其他數(shù)據(jù)。 (結(jié)構(gòu)如附件圖) 另外因?yàn)橹庙敂?shù)據(jù)的要求,在板塊的每組集合中還加了一個(gè)一級(jí)置頂集合。在整個(gè)系統(tǒng)中加了一個(gè)fid集合。
4、代碼實(shí)現(xiàn):
工具:因?yàn)閞edis數(shù)據(jù)庫需要初始化,所以單獨(dú)提供了初始化工具
1)、初始化工具php版
2)、初始化工具py版
新增類:
1)、redis底層驅(qū)動(dòng)類
2)、redis類
修改類:
1)、table_forum_thread 類
通過上述新增2個(gè)數(shù)據(jù)庫類和修改一個(gè)主題表類就能實(shí)現(xiàn)設(shè)計(jì)中的功能。
五、結(jié)論:
目前通過測(cè)試能達(dá)到目標(biāo)中的三項(xiàng)要求。
1)、四種主題列表排序方式,不管翻頁到多少也,速度均在0.0x秒。
2)、在保證性能的前提下,可翻所有頁。
3)、和mysql實(shí)現(xiàn)無縫兼容。不影響mysql中正式數(shù)據(jù),在redis服務(wù)未啟動(dòng)的情況下自動(dòng)切換到老的分頁方式。 ![]()
一、結(jié)構(gòu)
init_tools 初始化程序
init_php.php
在使用discuz-redis擴(kuò)展的時(shí)候,需要使用上述程序進(jìn)行初始化redis數(shù)據(jù)庫一次。php版、py版都行。
upload 需要上傳到web目錄的文件
二、使用前提
1、redis服務(wù)器,http://http://redis.io/
2、php-redis擴(kuò)展,https://github.com/nicolasff/phpredis
3、DXEXTEND1.1.2beta以上,http://www.9999xn.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服務(wù)器地址
$muser = 'root'; mysql 用戶名
$mpw = '';
mysql密碼
$mdb = 'x25redis';
mysql中discuz數(shù)據(jù)庫名
$rhost = '127.0.0.1'; redis地址
$rport = 6379; redis端口
$_max_num_per_forum = 100000; 此項(xiàng)設(shè)置每個(gè)板塊最多顯示多少主題。如服務(wù)器內(nèi)存足夠,可填寫較大的值,顯示所有主題。
4、在服務(wù)器上執(zhí)行init_php.php同步redis數(shù)據(jù),例如/usr/local/php/bin/php /usr/local/src/init_php.php
按數(shù)據(jù)量大小大概遇到幾十秒到幾分種時(shí)間。建議在數(shù)據(jù)庫服務(wù)器負(fù)載低的時(shí)候運(yùn)行。
5、在Linux服務(wù)器上設(shè)置計(jì)劃任務(wù),每天半夜運(yùn)行一次init_php.php文件保證redis數(shù)據(jù)同步。時(shí)間點(diǎn)可以自定,建議凌晨3點(diǎn)或者4點(diǎn)。
四、關(guān)閉與啟動(dòng)
$_config['extend']['discuz_redis']['on'] = 1; 1為啟動(dòng),0為停止
五、注意事項(xiàng)
1,目前的版本不能和 innodb 插件一起用,這個(gè)問題會(huì)在下一版本中解決。2,該插件針對(duì)大數(shù)據(jù)大訪問量,數(shù)據(jù)庫壓力比較大的站點(diǎn),如果沒有性能問題則不建議使用,維護(hù)redis需要比較專業(yè)的技術(shù)。如果盲目使用反而適得其反。
discuz-redis-dxextend.zip
(7.93 KB, 下載次數(shù): 252)
2022-4-20 15:14 上傳
點(diǎn)擊文件名下載附件
|