<p id="gwjr0"></p>

    1. 注冊 | 登錄 |
      易站導航

      discuz-redis 擴展 輕松快速分頁 避免分頁瓶頸

      時間:2021-07-15人氣:-


      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



      上篇:discuz在后臺找不到用戶名前臺提示已經注冊

      下篇:Discuz X3/3.1 門戶中keywords和desc...