Discuz的快取體系

x3d發表於2014-01-04

參考文件:<http://dev.discuz.org/wiki/index.php?title=快取機制>

Discuz中涉及資料快取的地方有:

1. session Dz的session只儲存了登陸狀態,不是我們理解的儲存整個會話狀態的概念
2. cache
3. syscache
4. memory

我們通常意義上的快取應該是對應到discuz的memory這一塊,其他的三項可能是歷史遺留問題,造成在使用時有較多的入口。

先說session,Discuz的session是完全獨立的,存放在資料庫表 – common_session中,使用時需以$discuz->session->set(`lastolupdate`, TIMESTAMP);形式呼叫。表結構與一般快取的key -> value形式很大不同。

cache應該是最早的快取機制,概念上應該有基於db和file的兩種快取機制,db模式資料預設放在資料表 – common_cache中,他的操作方式在source/class/db/cache_sql中有所體現,配置項為$_config[`cache`][`type`] = `sql`;, 但沒有在程式碼中看到使用的地方,應該是被廢棄了。file模式存放在data/cache下面,同樣的,cache_file這個機制也應該是被廢棄了,直接放到了函式庫中。

syscache 是專門針對系統各項設定包括外掛的引數進行集中快取處理的機制,資料預設先存在資料表 – common_syscache中,然後在使用時存入到file中進行加速。所以他是一項特定的東西,但3.0以下file的存放目錄為data/cache,與cache的file模式存放的目錄相同,比較容易讓初入門者迷惑。

memory中引入的機制,他的定義應該是能真正提高系統效能的快取機制,如memcached、redis這類nosql的儲存引擎。

結論:

經過分析後,發現cache 與 memory應該可以合併起來,即在source/class/memory目錄(3.0)中加上file/db兩種driver,將原來cache目錄下的兩個檔案複製過來,簡單的修改一下即可,同時function_core中對應的方法也要進行相應修改。

涉及cache操作的方法在function_core.php 與function_cache.php兩個檔案中。

functin_core.php:loadcache、cachedata;這裡載入的指的是syscache,3.0中直接完全使用db的方式存放在common_syscache表中,放棄以前還要同步生成file快取的做法。合併file、db兩者引擎到memory中後,memory()應該就是日常快取使用者資料的唯一入口了,3.0以上由Core提供了全域性mem物件。

function_cache.php:updatecache、writetocache 同樣指的是syscache,writetocache方法應該是一個殘留的函式,它的作用是寫入指定的快取內容到file cache中。


相關文章