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、下面我們在緩存中添加一個key
為file_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、下面我們在緩存中添加一個key
為file_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、下面我們在緩存中添加一個key
為file_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
這時我們也可以愉快的重新獲取數據庫值,進行新的緩存啦。