北哥大話Yii2快取機制 File快取

2021-09-17 00:19:12 字數 4530 閱讀 8085

有的兄弟一定會說,file快取有什麼好講的那?不就是乙個set,然後在乙個get麼?那你知道的只是皮毛~

的確如大家所說,快取從表現層看就是乙個set(放資料),然後再乙個get(拿資料),但是請記住,這樣是不夠的,如果你不了解每個快取的實現原理、儲存特點等等,你是無法使用對場景的,什麼時候用file快取、什麼時候用db快取、什麼時候用memcache快取,這些才是我們要學的。

依然先寫目錄

filecache的定義

filecache的基本用法

filecache儲存內容時的邏輯實現

可能一句話就可以說明白,將某些資料存到檔案中,下次讀取的時候直接從檔案中讀,分流壓力。

為了統一介面,yii2將所有型別的快取都統一成以下這些方法。

get() // 根據乙個指定的key獲取快取值,如果快取不存在或已經過期則返回false

set() // 直接儲存乙個值到快取(不考慮是否存在,直接替換)

add() // 如果此刻快取不存在則儲存,否則忽略

multiget() // 一次獲取多個key的快取值,引數為乙個key的陣列["key1","key2"],返回值也是乙個陣列["key1"=>"valuw1","key2"=>"value2"]

multiset() // 一次儲存多個快取

mulitadd() // 一次新增多個快取

delete() // 刪除某個快取

flush() // 刪除所有快取

以上8個方法我想通過文件大家都可以看明白,著實沒什麼難度,還有兩個方法在這裡重點說下,它們理解起來稍微蹩腳一些。

exists()

getorset()

exists($key)顧名思義,檢查乙個快取是否存在(快取過期 = 過期)。對於這個函式要注意以下幾點

當快取的資料量很大時,使用exists要比get快,但是如果快取沒有原生的exists,則exists會去模擬一下,這種情況下exists不會比get有效能提高,filecache 的exists未有提公升。

exists並不會檢查快取依賴,所以如果乙個快取有依賴而依賴的變化導致我們通過get獲取的值是false,但是有可能exists獲取的是true,這點要注意下。

getorset($key, closure $closure, $duration = null, $dependency = null)

這是v2.0.11增加的乙個新的方法。

$data = $cache->getorset($key, function () );
等同於

$data = $cache->get($key);

if ($data === false)

這個函式的用意是簡單的-如果有則獲取,沒有則建立,但是其中的$closure要提一下,它接收乙個閉包。閉包是php5.3引入的乙個新概念,如果不知道的可以用下面**補課一下

於是我們就可以寫乙個你可能不常見的快取**

$cache->getorset(['user','id'=>$id],function($cache) use ($id));
快取每乙個會員的資訊,使用use,最少**量。

以上就是yii2 cache對支援的所有快取統一的10個方法,下面我們會針對filecache進行一些原理性說明,為了方便大家閱讀,我們用問答模式。

上帝問:北哥,看文件我看什麼get、set、getorset的key除了乙個字串,還能接收乙個資料結構,是什麼意思?

// key是string的

$cache->set("article-1",$data);

// key是結構體,比如陣列

$cache->set(["article","id"=>1],$data);

這兩種形式都可以,我想你一定會問這些key是如何識別的那,在runtime的 cache我如何找到他們那?

上帝問:是的北哥,您說的對,比如我的key=abc,那麼儲存的時候是如何根據key來建立資料夾或快取檔案的那,他們是如何命名的那?

北哥答:yii對於檔案快取key的處理如下,我用偽**回答你。

//    對使用者快取定義的key進行再加工

if($key == 字串)else

}else

因此你能看到可能讓你矇圈的快取檔案,如下圖

現在不蒙圈了吧。但是一定要注意,看下面**

$cache->set("123",$data);

$cache->set(123,$data);

語句1會生成乙個123.bin的快取檔案,因為"123"是字串,而語句2的123是數字,會生成md5(123)後的.bin檔案。

現在你明白了檔案命名規則,我想上帝你一定也被那些13、59、a3、le這樣的資料夾弄暈了吧,再仔細看一下,是的,你發現了。。。

是檔名的前兩個字母

恭喜你,這是乙個多麼準確且偉大的發現。但是,我想你也一定見過這樣的快取目錄

目錄不止一級,很多級,這樣是有道理的,可以保證乙個資料夾內檔案不會過多,但是這個是如何實現的那?

這僅僅是乙個變數決定,它叫directorylevel(預設為1)

$cache->directorylevel = 3;
當然你也可以在web的cache裡配置,還是按照你剛才發現的密碼,如果directorylevel=3,則把檔名從頭開始,每2字元個做乙個資料夾(如果檔名只有3個字元,則建立到第二個的時候停止就好了)。

好的上帝,現在你明白了吧~

上帝問:你說的我明白了,我還有個問題,比如我在我模組裡set了乙個key=abc的快取,別人也set了乙個key=abc的快取(和我的key不是乙個含義),那豈不是被覆蓋了,能不能避免?

北哥答:必須的了,你可以使用乙個叫做keyprefix的變數,它為你的快取檔案名字加乙個字首,看**

$cache->keyprefix = "nai8_";

$cache->set("hello","hello keyprefix");

結果如下

這回你不怕了,看看誰還敢和你衝突。

上帝問:我基本都明白了,再問你乙個問題,回答完後我就回花果山了,就是比如我寫了$cache->set("a","abc",1000),但是當我get的時候,yii怎麼知道到了1000秒,已經過期還是沒過期那,我看檔案內容裡沒有1000這個數字啊,到底存在什麼地方?

北哥答:你說的沒錯,這要介紹乙個php的函式了 --- touch(),這個函式可以修改乙個檔案的上一次修改時間,當我們執行 $cache->set("a","abc",1000)時候,yii的filecache做了一件事情,看**

touch("快取檔案",(time() + 1000));
你明白了吧,當我們讀的時候,只需要判斷filetime("快取檔案")的上次修改時間是否大於現在time(),不就可以了麼,多簡單的事情。

omg~ fly fly fly ......

可是我還沒說完~

下面開始北哥自言自語一小段,講講快取依賴(set、add、getorset都有這個引數),什麼意思那,簡單的說就是乙個快取和某個東東有關聯,當這個東東發生變化時,則這個快取失效(既是當前過期時間還沒到)

因為篇幅問題,我們這裡先說乙個cache的資料庫依賴,以後會在「北哥大話yii2快取機制」單獨拿出一篇來講各種依賴。

$dependency = new \yii\caching\dbdependency(

['sql' => 'select count(*) from user']

);// 當資料庫字段發生變化時,該快取失效

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

依賴還是蠻有用的,比如一些統計資料的顯示做快取,當資料變化時快取資料能得到及時的更新。

講的好長~作為「北哥大話yii2快取機制」第一篇,希望大家喜歡,為了一段日子裡我會專注於分享yii2的快取機制。

感謝兄弟連各位兄弟的大力支援。

Yii2快取機制 快取依賴

我們都知道,yii2的快取是支援依賴的,就是我們設定的快取是否失效除了過期時間還決定於它所依賴的東東是否變化。用好依賴將大大提高我們使用快取的效果,本節講解yii2快取的5種依賴方式。還是先列某 yiicachingdbdependency yiicachingexpressiondependenc...

yii2 重新整理快取(重新整理模型快取)

yii2開啟表結構快取,因為當運用模型 model 時,ar的一些公共屬性都會從db中獲取,這樣會導致伺服器負擔一些額外的資源開銷,實際上對於成品來說,伺服器這些開始銷是多餘的,故應該阻止這種預設行為,把錶結構進行快取起來,提高效率.yii2的快取值得深入研究學習.開啟資料庫表結構的schema快取...

yii2快取的介紹和使用

又是到我們第一步操作的時候了,我們先來配置元件。方便起見,我們的快取元件配置在common config main.php檔案,先來簡單配置下檔案快取 components cache class yii caching filecache cachepath runtime cache2 所謂的檔...