Yii2性能優化之:緩存依賴

Yii中的緩存依賴,簡單來講就是將緩存和另一個東西綁定在一塊兒,若是另一個東西發生變化,那麼緩存也將發生變化。有點兒相似於JS中的觸發事件(可是也不那麼像),緩存的變更是依賴的東西所致使的。php

依賴能夠是文件、數據庫、甚至是一些表達式。功能十分強大。sql

Yii提供了5中依賴方法,咱們這裏介紹其中的3種經常使用依賴。數據庫

一、文件依賴

顧名思義就是將緩存和文件綁定在一塊兒。若是文件的內容發生變化,那麼緩存將會收到影響。(Yii判斷的標準是文件的最後修改時間)express

咱們經過實例來演示一下這個過程。緩存

一、首先獲取緩存組件app

$cache = \Yii::$app->cache;

二、實例化FileDependency類(其中文件依賴名字爲:fileName),同時將其賦值給$dependency變量。這裏,咱們將緩存和yanying.txt文件作關聯,若是yanying.txt內容發生變化,那麼和之對應的緩存將失效,不能訪問。yii

$dependency = new \yii\caching\FileDependency(['fileName'=>'yanying.txt']);

三、下面咱們在緩存中添加一個keyfile_key,給其的值爲hello world。同時將過時時間設置爲3000秒,最後一個參數寫上$dependency依賴。code

$cache->add('file_key','hello world',3000,$dependency);

四、在3000秒以內,咱們刷新網頁。一直能夠獲取到file_key的值爲hello world事件

$cache->get('file_key'); // hello world

五、這時,咱們改變yanying.txt文件內的值。儘管緩存並無過時,咱們也沒法獲取到緩存的值。由於依賴的文件發生了變化,緩存即被失效。get

var_dump($cache->get('file_key')); // false

二、表達式依賴

表達式依賴是將表達式運算事後的值和緩存捆在一塊兒造成依賴,當表達式值發生變化時候,緩存將受到影響

一、同上獲取緩存組件

$cache = \Yii::$app->cache;

二、實例化ExpressionDependency類(表達式依賴名字爲:expression),同時將其賦值給$dependency變量。這裏,表達式依賴不一樣於文件依賴,他的expression所對應的是\Yii::$app->request->get("id"),是直接get連接中的id值(這裏的表達式是php表達式,不僅限制於YII代碼)。

$dependency = new \yii\caching\ExpressionDependency(['expression'=>'\Yii::$app->request->get("id")']);

三、下面咱們在緩存中添加一個keyfile_key,值爲hello world。同時將其過時時間設置爲3000秒以後,最後一個參數寫上$dependency依賴。

$cache->add('file_key','hello world',3000,$dependency);

四、在3000秒以內,咱們刷新網頁,同上,一直能夠獲取到file_key的值爲hello world

$cache->get('file_key'); // hello world

五、這時,咱們改變連接中id的值。那麼:\Yii::$app->request->get("id")獲取到的值即會發生變化,則緩存失效。同時沒法獲取緩存的值。

var_dump($cache->get('file_key')); // false

三、db依賴

db依賴也是實際生產中最常接觸的一種依賴,咱們能夠將SQL語句直接做爲依賴條件。當數據庫查詢出的內容發生變化時候,緩存即會受到影響。

依此,咱們能夠經過此方法來判斷咱們緩存的數據是否須要更新,當數據庫有變化內容時候,咱們更新緩存。

一、首先仍是獲取緩存組件

$cache = \Yii::$app->cache;

二、實例化DbDependency類(db依賴名爲:sql)。同時將其賦值給$dependency變量。其中sql對應的值是直接可執行的sql語句。

$dependency = new \yii\caching\DbDependency(['sql'=>'SELECT COUNT(*) FROM user']);

三、下面咱們在緩存中添加一個keyfile_key,值爲hello world。同時將其過時時間設置爲3000秒以後,最後一個參數寫上$dependency依賴。

$cache->add('file_key','hello world',3000,$dependency);

四、假設數據庫數據一直沒有發生變化,那麼3000秒以內此緩存不會發生任何變化。咱們能夠經過下面代碼直接獲取值hello world.

$cache->get('file_key'); // hello world

五、這時,若是數據庫添加了一條新的數據,那麼此緩存即將失效,沒法獲取。這裏sql依賴判斷標準是查詢結果,咱們這裏使用了記錄的條數,你也能夠直接使用select * from table只要結果發生變化,都會影響緩存

var_dump($cache->get('file_key')); // false

這時咱們也能夠愉快的從新獲取數據庫值,進行新的緩存啦。

相關文章
相關標籤/搜索