国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > CMS > Discuz > 正文

淺談Discuz的緩存機(jī)制

2024-09-11 09:02:46
字體:
供稿:網(wǎng)友

Discuz因?yàn)槠鋽?shù)據(jù)量的龐大以及數(shù)據(jù)更新的高頻率,而催生了兩個(gè)最為牛逼的東西:緩存技術(shù)和數(shù)據(jù)庫的設(shè)計(jì),這兩塊技術(shù)都是很值得研究和學(xué)習(xí)的地方,研究透了就可以舉一反三,觸類旁通,融為己用,應(yīng)用到自己的項(xiàng)目中去,最近在研究Discuz的緩存技術(shù),看之前我并沒有直接從代碼入手,而是先查了一些資料,看了一些別人的分析,然后再從代碼層面去研究,到現(xiàn)在也有了自己的一些理解,所以下面就談?wù)刣iscuz的緩存技術(shù).

但凡研究一個(gè)東西,個(gè)人認(rèn)為首先得弄懂它的核心思想,思想通了,技術(shù)上的實(shí)現(xiàn)就是單純的技術(shù)問題了,也大同小異,基本差不多,也才能真正舉一反三,融為己用,discuz的緩存機(jī)制簡單的說就是將一些重復(fù)操作的結(jié)果集保存下來,以后再收到同樣的操作時(shí)直接從緩存的結(jié)果集中取出數(shù)據(jù)來使用而不用再去重復(fù)執(zhí)行相同的操作,這樣做的好處就是減少一些重復(fù)性的解析或者SQL查詢之類的動(dòng)作,從而有效的緩解服務(wù)器的壓力,discuz的緩存分為三種:模板緩存,文件緩存和數(shù)據(jù)緩存。

一、模板緩存

discuz模板緩存的大體思路是這樣的:解析模板的時(shí)候程序會(huì)去檢查該模板的緩存文件(文件名為:模板id+模板名+.tpl.php)是否存在,如果不存在會(huì)直接解析該模板并生成一個(gè)緩存文件,而該緩存文件已經(jīng)是經(jīng)過discuz模板引擎解析過的文件,文件中的語言標(biāo)識(shí)已經(jīng)全部被替換成標(biāo)準(zhǔn)的php語句。當(dāng)下次的請(qǐng)求再次執(zhí)行到這個(gè)模板時(shí),在緩存文件已經(jīng)存在的情況下,程序會(huì)去檢查模板文件與緩存文件的更新時(shí)間,如果模板文件沒有更新則直接調(diào)用緩存文件,這樣的好處是減少重復(fù)解析模板的過程,而discuz模板的解析是用正則表達(dá)式經(jīng)過復(fù)雜的替換操作,然后把那些語言標(biāo)記都替換成標(biāo)準(zhǔn)的php語句,這個(gè)過程是比較耗時(shí)間的,所以經(jīng)過這么緩存之后無疑對(duì)服務(wù)器壓力的緩解有著很大幫助。

二、文件緩存

discuz的文件緩存相對(duì)比較簡單,簡單的說就是把一些經(jīng)常用到的,但是更新不是很頻繁的數(shù)據(jù)緩存在一個(gè)文件中,比如一些配置參數(shù)還有一些設(shè)置等,在config/config_global.php中有這么一個(gè)配置:$_config['cache']['type'] = 'sql',//緩存文件類型,file-文件緩存,sql-數(shù)據(jù)庫緩存。當(dāng)這個(gè)配置改成file時(shí),discuz生成的緩存將通過方法寫入文件中,文件緩存存儲(chǔ)在data/cache目錄下,使用文件緩存的好處是當(dāng)你的服務(wù)器存在MySQL壓力較大時(shí),可以通過file的緩存機(jī)制來緩解MySQL的壓力,這種緩存機(jī)制是用服務(wù)器的IO來換取MySQL的讀寫頻率,降低MySQL的壓力,程序在調(diào)用的時(shí)候直接引入緩存文件即可,這里就不再贅述,具體實(shí)現(xiàn)的代碼就不附上了。

三、數(shù)據(jù)緩存

數(shù)據(jù)緩存和模板緩存一樣的經(jīng)典,前不久發(fā)現(xiàn)以前做的一個(gè)項(xiàng)目在訪問的人比較多時(shí),就顯得非常慢,后來走查代碼發(fā)現(xiàn)在整個(gè)程序的入口文件home.php中調(diào)用了接口并有兩次的switch判斷,于是就想把這部分緩存起來,剛開始時(shí)想用文件緩存的方式緩存,但是后來老大說這樣緩存的話在前端有兩臺(tái)服務(wù)器的時(shí)候就有可能出現(xiàn)文件生成或?qū)懭胧〉那闆r,于是也就放棄了文件緩存的方式。最后采用了discuz的數(shù)據(jù)緩存。數(shù)據(jù)緩存用了兩個(gè)方法:loadcache,save_syscache。loadcache取緩存數(shù)據(jù),并存放在$_G['cache'][$cname]中如果為空則調(diào)用save_syscache寫入緩存,實(shí)質(zhì)是寫入common_syscache表,而如果不為空,則也調(diào)用save_syscache清除緩存,再寫入緩存,從而實(shí)現(xiàn)緩存的更新。這樣home.php中的接口的調(diào)用就沒必要了,轉(zhuǎn)為讀取緩存中的數(shù)據(jù)即可,接著再把那兩個(gè)switch判斷轉(zhuǎn)移到具體的模塊下面并改為數(shù)組的方式來實(shí)現(xiàn),避免了每個(gè)模塊通過入口文件的時(shí)候不管用到用不到都得執(zhí)行的弊端。完了之后速度明顯快了很多,運(yùn)行很順暢。這是第一次真正開始接觸緩存并用到了實(shí)踐中,很有成就感,很開心。

其實(shí)數(shù)據(jù)緩存還有一些東西沒整明白,雖然會(huì)用了,但我還會(huì)繼續(xù)研究,真正做到透徹。discuz的緩存很牛逼,還有數(shù)據(jù)表的設(shè)計(jì).

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 霍林郭勒市| 沧州市| 嘉定区| 平山县| 射阳县| 轮台县| 营山县| 县级市| 遂溪县| 湄潭县| 云安县| 观塘区| 门源| 绥棱县| 英山县| 徐闻县| 双峰县| 肇庆市| 拜泉县| 玛纳斯县| 静海县| 中山市| 曲周县| 小金县| 大安市| 万山特区| 巴青县| 防城港市| 濮阳县| 商南县| 苏尼特右旗| 桐柏县| 济源市| 庐江县| 九龙县| 襄汾县| 麻阳| 龙海市| 灵台县| 仪征市| 兴安盟|