天天看點

Discuz的緩存體系

參考文檔:<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中。