【Discuz緩存機制】實現Discuz緩存機制的實時更新與自動刷新


本文為我(7u5/陳秋武)原創,歡迎轉載,請保留此行或注明出處。本文以Discuz7.2版本為基礎。
Discuz模板機制在config.inc.php中設置$tplrefresh為1即實現模板緩存的自動更新。

但是基於同樣的原理並無法在數據緩存機制中實現。
因為數據源為數據庫中數據時,cdb_caches中的dateline字段(緩存更新時間)如果每次取出作為判斷標志,則會加大數據庫的連接壓力。

我在最近的項目中遇到類似的問題,並思索總結出了自己的解決方案,現在提出來給大家共享:
(1)在原來緩存機制的基礎上建立一個緩存名字段與dateline字段對應的緩存。如cache_dateline.php。
(2)寫一個getcache函數,每次加載緩存前,先載入cache_dateline.php,然后用cache_緩存名.php(如cache_7u5.php)的修改時間與cache_dataline.php緩存中的dateline值做對比。如果cache_dateline.php中的時間戳大於緩存文件cache_7u5.php的修改時間,則調用updatecache('7u5'),否則直接加載cache_7u5.php。
(3)這里就涉及到一個問題,及cache_dateline.php緩存的更新。我略微思索決定把這個步驟加入到updatecache的replace into段中,同時更新dateline緩存數據及cache_dateline.php,以便保證cache_dateline.php的緩存更新。

總體實現完以后,就可以讓Discuz徹底脫離手動更新緩存,而只稍微增加一點點小負載,即在使用前判斷兩者修改時間,判斷前加載cache_dateline.php(因為只有緩存名和dateline字段,所以大小很小,頂多幾十k)。
這個項目實現,很適合於大負載的文本閱讀站點中使用,因為純靜態化的空間復雜度過高,在移植維護時非常不便。
(4)大文本內容緩存的更新在這種策略的基礎上,結合目錄切割,類似Ucenter用戶的目錄切割。000/00/00,在加載之前進行文本更新判斷。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM