Discuz! 快取

Discuz! X2.5 的 config_global.php 中有這樣一行程式碼

$_config['cache']['type'] = 'sql';

這就是 Discuz! 內建的快取方式,如果填寫 'sql' 則為使用資料庫快取,填寫 'file' 則為使用檔案快取。

記憶體級快取

快取層的引入是為瞭解決 MYSQL 自身對高併發處理的效能瓶頸,目前產品快取層採用主流的 Key-Value 對形式,記憶體級的快取產品很
多,支援的記憶體最佳化介面有 Memcache 、 eAccelerator 、 Alternative PHP
Cache(APC) 、 Xcache 、 Redis
五種,最佳化系統將會依據當前伺服器環境依次選用介面,單伺服器環境中推薦使用 APC,多伺服器環境中推薦使用 Redis 或 Memcache 。

資料層是以表為單位的類檔案,所有表類都繼承 discuz_table 基類,基類實現快取操 作的相關函式;理論上所有的資料表均可以快取,目前產品在六個壓力大的資料表內建開啟了快取 機制:使用者相關表、回帖、主題、主題和專輯關係、淘貼專輯、使用者關注關係。

  • 使用者相關表

快取表:'common_member', 'count', 'status','profile', 'field_home', 'field_forum'。
UID 為快取 KEY 。表資料更新時快取資料會同步更新。

  • 回帖

以 TID 為單位,快取第一頁的 post 資料。表資料更新時快取資料會同步更新。

  • 主題

TID 為快取 KEY 。表資料更新時快取資料會同步更新。
版塊列表預設引數第一頁時以 forumdisplay_FID 為快取 KEY, 快取時間內資料不更新。

  • 主題和專輯關係

以 TID 為單位,此 TID 的專輯 ID 集合, 表資料更新時快取資料會同步更新。

  • 淘貼專輯

以 TID 為單位,此 TID 的專輯集合, 快取時間內資料不更新。

  • 使用者關注關係

以 UID 為單位,此 UID 關注使用者的關係資料, 快取時間內資料不更新。

記憶體級快取層實現細節

  • discuz_table 基類中快取機制的實現
 /**
* @var string 快取主鍵名字首, 為空時表示此表不支援快取
*/
protected $_pre_cache_key;

/**
* @var string 快取時間, 以秒為單位,0 表示永久或相關配置檔案中的預設值
*/
protected $_cache_ttl;
  • discuz_table 基類中快取機制的方法
//快取一個變數到快取中,如果 KEY 已經在則會被覆蓋為新值
store_cache($id, $data, $cache_ttl = null, $pre_cache_key = null)
//獲取指定 KEY 的快取資料
fetch_cache($ids, $pre_cache_key = null)
//清除指定 KEY 的快取
clear_cache($ids, $pre_cache_key = null)
//更新一個已經存在的 KEY, 只更新修改的欄位
update_cache($id, $data, $cache_ttl = null, $pre_cache_key = null)
//批次更新快取,只更新已經存在 KEY 的指定修改的欄位
update_batch_cache($ids, $data, $cache_ttl = null, $pre_cache_key = null)
//重置已經存在的 KEY 的值
reset_cache($ids, $pre_cache_key = null)
//累加快取資料中某欄位的值
increase_cache($ids, $data, $cache_ttl = null, $pre_cache_key = null)