摘要:我們都知道,的緩存是支持依賴的,就是我們?cè)O(shè)置的緩存是否失效除了過(guò)期時(shí)間還決定于它所依賴的東東是否變化。用好依賴將大大提高我們使用緩存的效果,本節(jié)講解緩存的種依賴方式?,F(xiàn)在我們?nèi)匀煌ㄟ^(guò)一個(gè)例子說(shuō)明,假設(shè)我們的一個(gè)緩存同時(shí)依賴于兩個(gè)依賴。
我們都知道,yii2的緩存是支持依賴的,就是我們?cè)O(shè)置的緩存是否失效除了過(guò)期時(shí)間還決定于它所依賴的東東是否變化。
用好依賴將大大提高我們使用緩存的效果,本節(jié)講解yii2緩存的5種依賴方式。
還是先列某
yiicachingDbDependency
yiicachingExpressionDependency
yiicachingFileDependency
yiicachingTagDependency
yiicachingChainedDependency
begin...
DbDependency我們可以將SQL語(yǔ)句直接作為依賴條件。當(dāng)數(shù)據(jù)庫(kù)查詢出的內(nèi)容發(fā)生變化時(shí)候,緩存即會(huì)受到影響。
假設(shè)我當(dāng)前要搜索出所有的分類信息并緩存起來(lái),每3000秒更新一次或當(dāng)分類有變化是后自動(dòng)更新,使用DbDependency我們可以輕松實(shí)現(xiàn)。
$dependency = new yiicachingDbDependency(["sql"=>"SELECT COUNT(*) FROM category"]); $cache->add("category",function($cache){ return Category::find()->all(); },3600,dependency);
使用緩存獲取數(shù)據(jù)
$cache->get("category");
代碼執(zhí)行后,當(dāng)超過(guò)3000秒或分類字段條數(shù)有變化,都將緩存設(shè)置為失效。該依賴的推薦為依賴?yán)飯?zhí)行的sql語(yǔ)句所損耗的資源最好小于緩存所帶來(lái)的損耗。
ExpressionDependency指定的 PHP 表達(dá)式執(zhí)行結(jié)果發(fā)生變化,則緩存變化,這里的表達(dá)式為整個(gè)PHP,而不局限于Yii。
$dependency = new yiicachingExpressionDependency(["expression"=>"Yii::$app->request->get("id")"]); $cache->add("hy","Hello Yii",3000,$dependency);
獲取緩存數(shù)據(jù)
$cache->get("hy");
如上面代碼,我們?cè)?000之內(nèi)使用hy都直接從緩存讀取Hello Yii,但是當(dāng)使用緩存的頁(yè)面url ?id=xx發(fā)生變化的時(shí)候則失敗,返回flase
FileDependency將緩存和文件綁定在一起。如果文件的內(nèi)容發(fā)生變化,那么緩存將會(huì)收到影響。而Yii是根據(jù)這個(gè)文件的最后修改時(shí)間來(lái)判斷其內(nèi)容是否變化的。
依賴文件 hello.txt,其內(nèi)容為a
設(shè)置依賴
$dependency = new yiicachingFileDependency(["fileName"=>"@app/hello.txt"]); $cache->add("hy","Hello Yii",3000,$dependency);
獲取緩存數(shù)據(jù)
$cache->get("hy");
現(xiàn)在當(dāng)我們將hello.txt 內(nèi)容改為b的時(shí)候,再次獲取緩存則失敗,返回flase。
小提示:文件路徑可以使用別名哦
該類依賴的意思是某個(gè)或某些緩存是否失效除了由時(shí)間決定,還有一個(gè)標(biāo)簽決定,舉例說(shuō)明
use yiicachingTagDependency; $cache->add("abc","Hello Yii",3000,new TagDependency(["tags" => "num"]));
此刻我們?cè)O(shè)置了一個(gè)緩存abc,它依賴于標(biāo)簽num
當(dāng)我們?cè)谄渌拇a中執(zhí)行了
use yiicachingTagDependency; TagDependency::invalidate(Yii::$app->cache, "num");
當(dāng)我們執(zhí)行TagDependency::invalidate(Yii::$app->cache, "num");時(shí),可以將與num標(biāo)簽相關(guān)的緩存設(shè)置為無(wú)效,因此當(dāng)我們?cè)俅潍@取時(shí),abc已經(jīng)失效,即便3000秒還沒(méi)有到。
ChainedDependency一個(gè)系統(tǒng)中的數(shù)據(jù)是彼此相連的,緩存的依賴也可能出現(xiàn)多種聯(lián)系,使用TagDependency可以將一組緩存標(biāo)記為同一個(gè)標(biāo)簽,然后使用invalidate函數(shù)將這組緩存統(tǒng)一失效,但是這樣還不足以滿足千變?nèi)f化的依賴關(guān)系。
因此 ChainedDependency 出現(xiàn)了,我們可以將一系列的緩存依賴使用 ChainedDependency 組合起來(lái),這樣當(dāng)這個(gè)組合中的某個(gè)或全部依賴發(fā)生變化后,將直接影響到緩存。
現(xiàn)在我們?nèi)匀煌ㄟ^(guò)一個(gè)例子說(shuō)明,假設(shè)我們的一個(gè)緩存同時(shí)依賴于兩個(gè)依賴。
$cache = Yii::$app->cache; $fileDependency = new yiicachingFileDependency(["fileName"=>"@app/hello.txt"]); $sqlDependency = new yiicachingDbDependency(["sql"=>"SELECT COUNT(*) FROM category"]); $cache->set("abc", "hello yii", 3000, new ChainedDependency([ "dependOnAll"=>true, "dependencies" => [$fileDependency, $sqlDependency] ]));
這樣,當(dāng) $fileDependency 和 $sqlDependency 中任何一個(gè)依賴發(fā)生變化后都會(huì)引起緩存的失效,這里要注意一個(gè)問(wèn)題 dependOnAll(默認(rèn)為true),當(dāng)為true時(shí),只要依賴組合中的一個(gè)發(fā)生變化則緩存失效,否則必須每個(gè)依賴都變化才會(huì)引起緩存的失效。
北哥的話緩存是我們提供程序性能的主要手段,以上五種依賴務(wù)必記住,當(dāng)我們使用緩存的時(shí)候,優(yōu)化緩存邏輯也是我們要考慮的,如何有效的使用依賴保證因?yàn)橐蕾嚩鴰?lái)的各種延時(shí),是每個(gè)攻城獅要研究的。
原文鏈接 http://nai8.me/sapper-index.html
下面是我的小廣告,關(guān)注公眾號(hào),分享干貨
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/61857.html
摘要:講的好長(zhǎng)作為北哥大話緩存機(jī)制第一篇,希望大家喜歡,為了一段日子里我會(huì)專注于分享的緩存機(jī)制。 有的兄弟一定會(huì)說(shuō),F(xiàn)ile緩存有什么好講的那?不就是一個(gè)set,然后在一個(gè)get么?那你知道的只是皮毛~ 的確如大家所說(shuō),緩存從表現(xiàn)層看就是一個(gè)set(放數(shù)據(jù)),然后再一個(gè)get(拿數(shù)據(jù)),但是請(qǐng)記住,這樣是不夠的,如果你不了解每個(gè)緩存的實(shí)現(xiàn)原理、存儲(chǔ)特點(diǎn)等等,你是無(wú)法使用對(duì)場(chǎng)景的,什么時(shí)候用F...
摘要:數(shù)據(jù)庫(kù)緩存并不麻煩,基本用法依然符合緩存的統(tǒng)一接口,具體方法可以在里查看。會(huì)被的函數(shù)引用,該函數(shù)被和觸發(fā)。 數(shù)據(jù)庫(kù)緩存并不麻煩,基本用法依然符合yii2緩存的統(tǒng)一接口,具體方法可以在 http://nai8.me/sapper-view.ht... 里查看。 如果要啟動(dòng)數(shù)據(jù)庫(kù)緩存,必須要有一個(gè)數(shù)據(jù)庫(kù)及數(shù)據(jù)表,這些可以通過(guò)cache的配置文件完成 cache => [ class...
摘要:優(yōu)雅的服務(wù)降級(jí)微服務(wù)架構(gòu)最大的優(yōu)點(diǎn)之一就是當(dāng)組件出現(xiàn)故障時(shí),能隔離這些故障并且能做到優(yōu)雅地服務(wù)降級(jí)。 本文首先介紹微服務(wù)架構(gòu)存在的風(fēng)險(xiǎn),然后針對(duì)如何避免微服務(wù)架構(gòu)的故障,提出了多種有效的微服務(wù)架構(gòu)中的方法和技術(shù),其中例如服務(wù)降級(jí)、變更管理、健康檢查和修復(fù)、斷路器、限流器等。 目錄 1、微服務(wù)架構(gòu)的風(fēng)險(xiǎn) 2、優(yōu)雅的服務(wù)降級(jí) 3、變更管理 4、健康檢查和負(fù)載均衡 5、自我修復(fù) 6、故障轉(zhuǎn)移...
摘要:優(yōu)雅的服務(wù)降級(jí)微服務(wù)架構(gòu)最大的優(yōu)點(diǎn)之一就是當(dāng)組件出現(xiàn)故障時(shí),能隔離這些故障并且能做到優(yōu)雅地服務(wù)降級(jí)。 本文首先介紹微服務(wù)架構(gòu)存在的風(fēng)險(xiǎn),然后針對(duì)如何避免微服務(wù)架構(gòu)的故障,提出了多種有效的微服務(wù)架構(gòu)中的方法和技術(shù),其中例如服務(wù)降級(jí)、變更管理、健康檢查和修復(fù)、斷路器、限流器等。 目錄 1、微服務(wù)架構(gòu)的風(fēng)險(xiǎn) 2、優(yōu)雅的服務(wù)降級(jí) 3、變更管理 4、健康檢查和負(fù)載均衡 5、自我修復(fù) 6、故障轉(zhuǎn)移...
閱讀 2621·2021-11-16 11:40
閱讀 3417·2021-11-08 13:26
閱讀 886·2021-10-28 09:32
閱讀 3542·2021-09-13 10:26
閱讀 815·2019-08-30 15:55
閱讀 788·2019-08-30 15:44
閱讀 1917·2019-08-30 15:44
閱讀 1762·2019-08-30 13:48