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