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服務未啟動的情況下自動切換到老的分頁方式。

一、結構
init_tools 初始化程序
init_php.php
在使用discuz-redis擴展的時候,需要使用上述程序進行初始化redis數據庫一次。php版、py版都行。
upload 需要上傳到web目錄的文件
二、使用前提
1、redis服務器
2、php-redis擴展
3、
DXEXTEND1.1.2beta以上三、安裝步驟
1、上傳upload文件夾中的文件到論壇根目錄
2、在 config/config_global.php 中增加如下配置
// ----------------------- CONFIG DISCUZ_REDIS ------------------------ //
$_config['extend']['discuz_redis']['on'] = 1;
$_config['discuz_redis']['server'] = 'ct.e0z.com';
$_config['discuz_redis']['port'] = 6379;
$_config['discuz_redis']['pconnect'] = 1;
$_config['discuz_redis']['auth'] = '';
$_config['discuz_redis']['db'] = '0';
3、上述配置好后,修改init_php.php文件分別填寫:
$mhost = 'ct.e0z.com'; mysql服務器地址
$muser = 'root'; mysql 用戶名
$mpw = '';
mysql密碼
$mdb = 'x25redis';
mysql中discuz數據庫名
$rhost = 'ct.e0z.com'; 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需要比較專業的技術。如果盲目使用反而適得其反。
discuz-redis-dxextend.zip