天天看點

緩存技術之——Yii2性能優化之:緩存依賴

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

依賴可以是檔案、資料庫、甚至是一些表達式。功能十分強大。

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

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

我們通過執行個體來示範一下這個過程。

1、首先擷取緩存元件

2、執行個體化<code>FileDependency</code>類(其中檔案依賴名字為:<code>fileName</code>),同時将其指派給<code>$dependency</code>變量。這裡,我們将緩存和<code>yanying.txt</code>檔案做關聯,如果<code>yanying.txt</code>内容發生變化,那麼和之對應的緩存将失效,不能通路。

3、下面我們在緩存中添加一個<code>key</code>為<code>file_key</code>,給其的值為<code>hello world</code>。同時将過期時間設定為3000秒,最後一個參數寫上<code>$dependency</code>依賴。

4、在3000秒之内,我們重新整理網頁。一直可以擷取到<code>file_key</code>的值為<code>hello world</code>。

5、這時,我們改變<code>yanying.txt</code>檔案内的值。盡管緩存并沒有過期,我們也無法擷取到緩存的值。因為依賴的檔案發生了變化,緩存即被失效。

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

1、同上擷取緩存元件

2、執行個體化<code>ExpressionDependency</code>類(表達式依賴名字為:<code>expression</code>),同時将其指派給<code>$dependency</code>變量。這裡,表達式依賴不同于檔案依賴,他的<code>expression</code>所對應的是<code>\Yii::$app-&gt;request-&gt;get("id")</code>,是直接get連結中的id值(這裡的表達式是php表達式,不隻限制于YII代碼)。

3、下面我們在緩存中添加一個<code>key</code>為<code>file_key</code>,值為<code>hello world</code>。同時将其過期時間設定為3000秒之後,最後一個參數寫上<code>$dependency</code>依賴。

4、在3000秒之内,我們重新整理網頁,同上,一直可以擷取到<code>file_key</code>的值為<code>hello world</code>。

5、這時,我們改變連結中<code>id</code>的值。那麼:<code>\Yii::$app-&gt;request-&gt;get("id")</code>擷取到的值即會發生變化,則緩存失效。同時無法擷取緩存的值。

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

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

1、首先還是擷取緩存元件

2、執行個體化<code>DbDependency</code>類(db依賴名為:sql)。同時将其指派給<code>$dependency</code>變量。其中<code>sql</code>對應的值是直接可執行的sql語句。

4、假設資料庫資料一直沒有發生變化,那麼3000秒之内此緩存不會發生任何變化。我們可以通過下面代碼直接擷取值<code>hello world</code>.

5、這時,如果資料庫添加了一條新的資料,那麼此緩存即将失效,無法擷取。這裡sql依賴判斷标準是查詢結果,我們這裡使用了記錄的條數,你也可以直接使用<code>select * from table</code>隻要結果發生變化,都會影響緩存

這時我們也可以愉快的重新擷取資料庫值,進行新的緩存啦。