Discuz因為其數據量的龐大以及數據更新的高頻率,而催生了兩個最為牛逼的東西:緩存技術和數據庫的設計,這兩塊技術都是很值得研究和學習的地方,研究透了就可以舉一反三,觸類旁通,融為己用,應用到自己的項目中去,最近在研究Discuz的緩存技術,看之前我并沒有直接從代碼入手,而是先查了一些資料,看了一些別人的分析,然后再從代碼層面去研究,到現在也有了自己的一些理解,所以下面就談談discuz的緩存技術.
但凡研究一個東西,個人認為首先得弄懂它的核心思想,思想通了,技術上的實現就是單純的技術問題了,也大同小異,基本差不多,也才能真正舉一反三,融為己用,discuz的緩存機制簡單的說就是將一些重復操作的結果集保存下來,以后再收到同樣的操作時直接從緩存的結果集中取出數據來使用而不用再去重復執行相同的操作,這樣做的好處就是減少一些重復性的解析或者SQL查詢之類的動作,從而有效的緩解服務器的壓力,discuz的緩存分為三種:模板緩存,文件緩存和數據緩存。
一、模板緩存
discuz模板緩存的大體思路是這樣的:解析模板的時候程序會去檢查該模板的緩存文件(文件名為:模板id+模板名+.tpl.php)是否存在,如果不存在會直接解析該模板并生成一個緩存文件,而該緩存文件已經是經過discuz模板引擎解析過的文件,文件中的語言標識已經全部被替換成標準的php語句。當下次的請求再次執行到這個模板時,在緩存文件已經存在的情況下,程序會去檢查模板文件與緩存文件的更新時間,如果模板文件沒有更新則直接調用緩存文件,這樣的好處是減少重復解析模板的過程,而discuz模板的解析是用正則表達式經過復雜的替換操作,然后把那些語言標記都替換成標準的php語句,這個過程是比較耗時間的,所以經過這么緩存之后無疑對服務器壓力的緩解有著很大幫助。
二、文件緩存
discuz的文件緩存相對比較簡單,簡單的說就是把一些經常用到的,但是更新不是很頻繁的數據緩存在一個文件中,比如一些配置參數還有一些設置等,在config/config_global.php中有這么一個配置:$_config['cache']['type'] = 'sql',//緩存文件類型,file-文件緩存,sql-數據庫緩存。當這個配置改成file時,discuz生成的緩存將通過方法寫入文件中,文件緩存存儲在data/cache目錄下,使用文件緩存的好處是當你的服務器存在MySQL壓力較大時,可以通過file的緩存機制來緩解MySQL的壓力,這種緩存機制是用服務器的IO來換取MySQL的讀寫頻率,降低MySQL的壓力,程序在調用的時候直接引入緩存文件即可,這里就不再贅述,具體實現的代碼就不附上了。
三、數據緩存
數據緩存和模板緩存一樣的經典,前不久發現以前做的一個項目在訪問的人比較多時,就顯得非常慢,后來走查代碼發現在整個程序的入口文件home.php中調用了接口并有兩次的switch判斷,于是就想把這部分緩存起來,剛開始時想用文件緩存的方式緩存,但是后來老大說這樣緩存的話在前端有兩臺服務器的時候就有可能出現文件生成或寫入失敗的情況,于是也就放棄了文件緩存的方式。最后采用了discuz的數據緩存。數據緩存用了兩個方法:loadcache,save_syscache。loadcache取緩存數據,并存放在$_G['cache'][$cname]中如果為空則調用save_syscache寫入緩存,實質是寫入common_syscache表,而如果不為空,則也調用save_syscache清除緩存,再寫入緩存,從而實現緩存的更新。這樣home.php中的接口的調用就沒必要了,轉為讀取緩存中的數據即可,接著再把那兩個switch判斷轉移到具體的模塊下面并改為數組的方式來實現,避免了每個模塊通過入口文件的時候不管用到用不到都得執行的弊端。完了之后速度明顯快了很多,運行很順暢。這是第一次真正開始接觸緩存并用到了實踐中,很有成就感,很開心。
其實數據緩存還有一些東西沒整明白,雖然會用了,但我還會繼續研究,真正做到透徹。discuz的緩存很牛逼,還有數據表的設計.
新聞熱點
疑難解答