摘要:講的好長(zhǎng)作為北哥大話緩存機(jī)制第一篇,希望大家喜歡,為了一段日子里我會(huì)專注于分享的緩存機(jī)制。
有的兄弟一定會(huì)說(shuō),F(xiàn)ile緩存有什么好講的那?不就是一個(gè)set,然后在一個(gè)get么?那你知道的只是皮毛~
的確如大家所說(shuō),緩存從表現(xiàn)層看就是一個(gè)set(放數(shù)據(jù)),然后再一個(gè)get(拿數(shù)據(jù)),但是請(qǐng)記住,這樣是不夠的,如果你不了解每個(gè)緩存的實(shí)現(xiàn)原理、存儲(chǔ)特點(diǎn)等等,你是無(wú)法使用對(duì)場(chǎng)景的,什么時(shí)候用File緩存、什么時(shí)候用DB緩存、什么時(shí)候用Memcache緩存,這些才是我們要學(xué)的。
依然先寫(xiě)目錄
FileCache的定義
FileCache的基本用法
FileCache存儲(chǔ)內(nèi)容時(shí)的邏輯實(shí)現(xiàn)
FileCache的定義可能一句話就可以說(shuō)明白,將某些數(shù)據(jù)存到文件中,下次讀取的時(shí)候直接從文件中讀,分流壓力。
基本用法為了統(tǒng)一接口,yii2將所有類型的緩存都統(tǒng)一成以下這些方法。
get() // 根據(jù)一個(gè)指定的key獲取緩存值,如果緩存不存在或已經(jīng)過(guò)期則返回false set() // 直接保存一個(gè)值到緩存(不考慮是否存在,直接替換) add() // 如果此刻緩存不存在則保存,否則忽略 multiGet() // 一次獲取多個(gè)key的緩存值,參數(shù)為一個(gè)key的數(shù)組["key1","key2"],返回值也是一個(gè)數(shù)組["key1"=>"valuw1","key2"=>"value2"] multiSet() // 一次存儲(chǔ)多個(gè)緩存 mulitAdd() // 一次添加多個(gè)緩存 delete() // 刪除某個(gè)緩存 flush() // 刪除所有緩存
以上8個(gè)方法我想通過(guò)文檔大家都可以看明白,著實(shí)沒(méi)什么難度,還有兩個(gè)方法在這里重點(diǎn)說(shuō)下,它們理解起來(lái)稍微蹩腳一些。
exists() getOrSet()
exists($key)
顧名思義,檢查一個(gè)緩存是否存在(緩存過(guò)期 = 過(guò)期)。對(duì)于這個(gè)函數(shù)要注意以下幾點(diǎn)
當(dāng)緩存的數(shù)據(jù)量很大時(shí),使用exists要比get快,但是如果緩存沒(méi)有原生的exists,則exists會(huì)去模擬一下,這種情況下exists不會(huì)比get有性能提高,F(xiàn)ileCache 的exists未有提升。
exists并不會(huì)檢查緩存依賴,所以如果一個(gè)緩存有依賴而依賴的變化導(dǎo)致我們通過(guò)get獲取的值是false,但是有可能exists獲取的是true,這點(diǎn)要注意下。
getOrSet($key, Closure $closure, $duration = null, $dependency = null)
這是v2.0.11增加的一個(gè)新的方法。
$data = $cache->getOrSet($key, function () { return $this->calculateSomething(); });
等同于
$data = $cache->get($key); if ($data === false) { $data = $this->calculateSomething(); $cache->set($key, $data); }
這個(gè)函數(shù)的用意是簡(jiǎn)單的-如果有則獲取,沒(méi)有則建立,但是其中的$closure要提一下,它接收一個(gè)閉包。閉包是php5.3引入的一個(gè)新概念,如果不知道的可以用下面網(wǎng)址補(bǔ)課一下
http://www.cnblogs.com/melonb...
于是我們就可以寫(xiě)一個(gè)你可能不常見(jiàn)的緩存代碼
$cache->getOrSet(["user","id"=>$id],function($cache) use ($id){ return User::findOne($id); });
緩存每一個(gè)會(huì)員的信息,使用use,最少代碼量。
以上就是yii2 Cache對(duì)支持的所有緩存統(tǒng)一的10個(gè)方法,下面我們會(huì)針對(duì)FileCache進(jìn)行一些原理性說(shuō)明,為了方便大家閱讀,我們用問(wèn)答模式。
重點(diǎn)要說(shuō)的上帝問(wèn): 北哥,看文檔我看什么get、set、getOrSet的key除了一個(gè)字符串,還能接收一個(gè)數(shù)據(jù)結(jié)構(gòu),是什么意思?
北哥答:是的,你說(shuō)的不錯(cuò),比如我們現(xiàn)在要緩存每個(gè)文章,我們可以使用以下兩個(gè)方法
// key是string的 $cache->set("article-1",$data); // key是結(jié)構(gòu)體,比如數(shù)組 $cache->set(["article","id"=>1],$data);
這兩種形式都可以,我想你一定會(huì)問(wèn)這些key是如何識(shí)別的那,在runtime的 cache我如何找到他們那?
上帝問(wèn): 是的北哥,您說(shuō)的對(duì),比如我的key=abc,那么存儲(chǔ)的時(shí)候是如何根據(jù)key來(lái)建立文件夾或緩存文件的那,他們是如何命名的那?
北哥答: yii對(duì)于文件緩存key的處理如下,我用偽代碼回答你。
// 對(duì)用戶緩存定義的key進(jìn)行再加工 if($key == 字符串){ if($key字符串只含有數(shù)字或字母 && $key的長(zhǎng)度 <= 32 ){ return $key; }else{ md5($key) } }else{ return md5(json_encode($key)); // 數(shù)字的key、數(shù)組的key都被md5了。 }
因此你能看到可能讓你蒙圈的緩存文件,如下圖
現(xiàn)在不蒙圈了吧。但是一定要注意,看下面代碼
$cache->set("123",$data); $cache->set(123,$data);
語(yǔ)句1會(huì)生成一個(gè)123.bin的緩存文件,因?yàn)?123"是字符串,而語(yǔ)句2的123是數(shù)字,會(huì)生成md5(123)后的.bin文件。
現(xiàn)在你明白了文件命名規(guī)則,我想上帝你一定也被那些13、59、a3、le這樣的文件夾弄暈了吧,再仔細(xì)看一下,是的,你發(fā)現(xiàn)了。。。
是文件名的前兩個(gè)字母
恭喜你,這是一個(gè)多么準(zhǔn)確且偉大的發(fā)現(xiàn)。但是,我想你也一定見(jiàn)過(guò)這樣的緩存目錄
目錄不止一級(jí),很多級(jí),這樣是有道理的,可以保證一個(gè)文件夾內(nèi)文件不會(huì)過(guò)多,但是這個(gè)是如何實(shí)現(xiàn)的那?
這僅僅是一個(gè)變量決定,它叫directoryLevel(默認(rèn)為1)
$cache->directoryLevel = 3;
當(dāng)然你也可以在web的cache里配置,還是按照你剛才發(fā)現(xiàn)的密碼,如果directoryLevel=3,則把文件名從頭開(kāi)始,每2字符個(gè)做一個(gè)文件夾(如果文件名只有3個(gè)字符,則建立到第二個(gè)的時(shí)候停止就好了)。
好的上帝,現(xiàn)在你明白了吧~
上帝問(wèn): 你說(shuō)的我明白了,我還有個(gè)問(wèn)題,比如我在我模塊里set了一個(gè)key=abc的緩存,別人也set了一個(gè)key=abc的緩存(和我的key不是一個(gè)含義),那豈不是被覆蓋了,能不能避免?
北哥答: 必須的了,你可以使用一個(gè)叫做keyPrefix的變量,它為你的緩存文件名字加一個(gè)前綴,看代碼
$cache->keyPrefix = "nai8_"; $cache->set("hello","hello keyPrefix");
結(jié)果如下
這回你不怕了,看看誰(shuí)還敢和你沖突。
上帝問(wèn): 我基本都明白了,再問(wèn)你一個(gè)問(wèn)題,回答完后我就回花果山了,就是比如我寫(xiě)了$cache->set("a","abc",1000),但是當(dāng)我get的時(shí)候,yii怎么知道到了1000秒,已經(jīng)過(guò)期還是沒(méi)過(guò)期那,我看文件內(nèi)容里沒(méi)有1000這個(gè)數(shù)字啊,到底存在什么地方?
北哥答: 你說(shuō)的沒(méi)錯(cuò),這要介紹一個(gè)php的函數(shù)了 --- touch(),這個(gè)函數(shù)可以修改一個(gè)文件的上一次修改時(shí)間,當(dāng)我們執(zhí)行 $cache->set("a","abc",1000)時(shí)候,yii的FileCache做了一件事情,看代碼
touch("緩存文件",(time() + 1000));
你明白了吧,當(dāng)我們讀的時(shí)候,只需要判斷filetime("緩存文件")的上次修改時(shí)間是否大于現(xiàn)在time(),不就可以了么,多簡(jiǎn)單的事情。
OMG~ Fly fly fly ......
可是我還沒(méi)說(shuō)完~
下面開(kāi)始北哥自言自語(yǔ)一小段,講講緩存依賴(set、add、getOrSet都有這個(gè)參數(shù)),什么意思那,簡(jiǎn)單的說(shuō)就是一個(gè)緩存和某個(gè)東東有關(guān)聯(lián),當(dāng)這個(gè)東東發(fā)生變化時(shí),則這個(gè)緩存失效(既是當(dāng)前過(guò)期時(shí)間還沒(méi)到)
因?yàn)槠鶈?wèn)題,我們這里先說(shuō)一個(gè)Cache的數(shù)據(jù)庫(kù)依賴,以后會(huì)在“北哥大話Yii2緩存機(jī)制”多帶帶拿出一篇來(lái)講各種依賴。
$dependency = new yiicachingDbDependency( ["sql" => "SELECT count(*) FROM user"] ); // 當(dāng)數(shù)據(jù)庫(kù)字段發(fā)生變化時(shí),該緩存失效 $cache->add("three", "hello world!", 3000, $dependency);
依賴還是蠻有用的,比如一些統(tǒng)計(jì)數(shù)據(jù)的顯示做緩存,當(dāng)數(shù)據(jù)變化時(shí)緩存數(shù)據(jù)能得到及時(shí)的更新。
講的好長(zhǎng)~作為“北哥大話Yii2緩存機(jī)制”第一篇,希望大家喜歡,為了一段日子里我會(huì)專注于分享yii2的緩存機(jī)制。
感謝兄弟連各位兄弟的大力支持。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/61860.html
摘要:數(shù)據(jù)庫(kù)緩存并不麻煩,基本用法依然符合緩存的統(tǒng)一接口,具體方法可以在里查看。會(huì)被的函數(shù)引用,該函數(shù)被和觸發(fā)。 數(shù)據(jù)庫(kù)緩存并不麻煩,基本用法依然符合yii2緩存的統(tǒng)一接口,具體方法可以在 http://nai8.me/sapper-view.ht... 里查看。 如果要啟動(dòng)數(shù)據(jù)庫(kù)緩存,必須要有一個(gè)數(shù)據(jù)庫(kù)及數(shù)據(jù)表,這些可以通過(guò)cache的配置文件完成 cache => [ class...
摘要:我們都知道,的緩存是支持依賴的,就是我們?cè)O(shè)置的緩存是否失效除了過(guò)期時(shí)間還決定于它所依賴的東東是否變化。用好依賴將大大提高我們使用緩存的效果,本節(jié)講解緩存的種依賴方式。現(xiàn)在我們?nèi)匀煌ㄟ^(guò)一個(gè)例子說(shuō)明,假設(shè)我們的一個(gè)緩存同時(shí)依賴于兩個(gè)依賴。 我們都知道,yii2的緩存是支持依賴的,就是我們?cè)O(shè)置的緩存是否失效除了過(guò)期時(shí)間還決定于它所依賴的東東是否變化。 用好依賴將大大提高我們使用緩存的效果,本...
摘要:中是如何實(shí)現(xiàn)代碼的自動(dòng)加載的入口腳本的以下兩行代碼其中的作用注冊(cè)為自動(dòng)加載函數(shù)。這個(gè)負(fù)責(zé)引入了一個(gè)類中的,隨后立即解除注冊(cè)。注冊(cè)中的為自動(dòng)加載函數(shù),并利用配置文件即目錄下的文件對(duì)這個(gè)自動(dòng)加載函數(shù)進(jìn)行了初始化。 1.基本知識(shí) Include與require 的作用: 當(dāng)一個(gè)文件被包含時(shí),其中所包含的代碼繼承了 include 所在行的變量范圍。從該處開(kāi)始,調(diào)用文件在該行處可用的任何...
摘要:原作者分析了多個(gè)項(xiàng)目對(duì)函數(shù)的使用情況得到如下結(jié)果,當(dāng)然有可能你最常用的不在這個(gè)列表,北哥建議初學(xué)者對(duì)這些函數(shù)一一仔細(xì)研究。分析最常用的函數(shù)是字符串函數(shù),然后是數(shù)組,然后是文件。以上個(gè)函數(shù)沒(méi)有近期要丟棄的計(jì)劃。數(shù)據(jù)庫(kù)操作也不納入此排名。 這是一篇外文,翻譯給大家。原作者分析了1900多個(gè)項(xiàng)目對(duì)php函數(shù)的使用情況得到如下結(jié)果,當(dāng)然有可能你最常用的不在這個(gè)列表,北哥建議PHP初學(xué)者對(duì)這些函...
閱讀 4556·2021-11-24 10:24
閱讀 1469·2021-11-22 15:22
閱讀 2157·2021-11-17 09:33
閱讀 2548·2021-09-22 15:29
閱讀 570·2019-08-30 15:55
閱讀 1715·2019-08-29 18:42
閱讀 2788·2019-08-29 12:55
閱讀 1834·2019-08-26 13:55