Yii2性能優化之:緩存依賴

轉自  https://segmentfault.com/a/1190000006861193?_ea=1155522#911

Yii中的緩存依賴,簡單來說就是將緩存和另外一個東西綁定在一起,如果另外一個東西發生變化,那麼緩存也將發生變化。有點兒類似於JS中的觸發事件(但是也不那麼像),緩存的變動是依賴的東西所導致的。

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

Yii提供了5中依賴方法,我們這裏介紹其中的3種常用依賴。

1、文件依賴

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

我們通過實例來演示一下這個過程。

1、首先獲取緩存組件

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

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

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

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

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

4、在3000秒之內,我們刷新網頁。一直可以獲取到file_key的值爲hello world

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

5、這時,我們改變yanying.txt文件內的值。儘管緩存並沒有過期,我們也無法獲取到緩存的值。因爲依賴的文件發生了變化,緩存即被失效。

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

2、表達式依賴

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

1、同上獲取緩存組件

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

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

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

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

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

4、在3000秒之內,我們刷新網頁,同上,一直可以獲取到file_key的值爲hello world

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

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

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

3、db依賴

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

依此,我們可以通過此方法來判斷我們緩存的數據是否需要更新,當數據庫有變化內容時候,我們更新緩存。

1、首先還是獲取緩存組件

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

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

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

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

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

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

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

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

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

這時我們也可以愉快的重新獲取數據庫值,進行新的緩存啦。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章