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']);
三、下面咱們在緩存中添加一個key
爲file_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")']);
三、下面咱們在緩存中添加一個key
爲file_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依賴也是實際生產中最常接觸的一種依賴,咱們能夠將SQL語句直接做爲依賴條件。當數據庫查詢出的內容發生變化時候,緩存即會受到影響。
依此,咱們能夠經過此方法來判斷咱們緩存的數據是否須要更新,當數據庫有變化內容時候,咱們更新緩存。
一、首先仍是獲取緩存組件
$cache = \Yii::$app->cache;
二、實例化DbDependency
類(db依賴名爲:sql)。同時將其賦值給$dependency
變量。其中sql
對應的值是直接可執行的sql語句。
$dependency = new \yii\caching\DbDependency(['sql'=>'SELECT COUNT(*) FROM user']);
三、下面咱們在緩存中添加一個key
爲file_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
這時咱們也能夠愉快的從新獲取數據庫值,進行新的緩存啦。