摘要:講的好長作為北哥大話緩存機制第一篇,希望大家喜歡,為了一段日子里我會專注于分享的緩存機制。
有的兄弟一定會說,File緩存有什么好講的那?不就是一個set,然后在一個get么?那你知道的只是皮毛~
的確如大家所說,緩存從表現層看就是一個set(放數據),然后再一個get(拿數據),但是請記住,這樣是不夠的,如果你不了解每個緩存的實現原理、存儲特點等等,你是無法使用對場景的,什么時候用File緩存、什么時候用DB緩存、什么時候用Memcache緩存,這些才是我們要學的。
依然先寫目錄
FileCache的定義
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 () { return $this->calculateSomething(); });
等同于
$data = $cache->get($key); if ($data === false) { $data = $this->calculateSomething(); $cache->set($key, $data); }
這個函數的用意是簡單的-如果有則獲取,沒有則建立,但是其中的$closure要提一下,它接收一個閉包。閉包是php5.3引入的一個新概念,如果不知道的可以用下面網址補課一下
http://www.cnblogs.com/melonb...
于是我們就可以寫一個你可能不常見的緩存代碼
$cache->getOrSet(["user","id"=>$id],function($cache) use ($id){ return User::findOne($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 == 字符串){ if($key字符串只含有數字或字母 && $key的長度 <= 32 ){ return $key; }else{ md5($key) } }else{ return md5(json_encode($key)); // 數字的key、數組的key都被md5了。 }
因此你能看到可能讓你蒙圈的緩存文件,如下圖
現在不蒙圈了吧。但是一定要注意,看下面代碼
$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 yiicachingDbDependency( ["sql" => "SELECT count(*) FROM user"] ); // 當數據庫字段發生變化時,該緩存失效 $cache->add("three", "hello world!", 3000, $dependency);
依賴還是蠻有用的,比如一些統計數據的顯示做緩存,當數據變化時緩存數據能得到及時的更新。
講的好長~作為“北哥大話Yii2緩存機制”第一篇,希望大家喜歡,為了一段日子里我會專注于分享yii2的緩存機制。
感謝兄弟連各位兄弟的大力支持。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/61860.html
摘要:數據庫緩存并不麻煩,基本用法依然符合緩存的統一接口,具體方法可以在里查看。會被的函數引用,該函數被和觸發。 數據庫緩存并不麻煩,基本用法依然符合yii2緩存的統一接口,具體方法可以在 http://nai8.me/sapper-view.ht... 里查看。 如果要啟動數據庫緩存,必須要有一個數據庫及數據表,這些可以通過cache的配置文件完成 cache => [ class...
摘要:我們都知道,的緩存是支持依賴的,就是我們設置的緩存是否失效除了過期時間還決定于它所依賴的東東是否變化。用好依賴將大大提高我們使用緩存的效果,本節講解緩存的種依賴方式。現在我們仍然通過一個例子說明,假設我們的一個緩存同時依賴于兩個依賴。 我們都知道,yii2的緩存是支持依賴的,就是我們設置的緩存是否失效除了過期時間還決定于它所依賴的東東是否變化。 用好依賴將大大提高我們使用緩存的效果,本...
摘要:中是如何實現代碼的自動加載的入口腳本的以下兩行代碼其中的作用注冊為自動加載函數。這個負責引入了一個類中的,隨后立即解除注冊。注冊中的為自動加載函數,并利用配置文件即目錄下的文件對這個自動加載函數進行了初始化。 1.基本知識 Include與require 的作用: 當一個文件被包含時,其中所包含的代碼繼承了 include 所在行的變量范圍。從該處開始,調用文件在該行處可用的任何...
摘要:原作者分析了多個項目對函數的使用情況得到如下結果,當然有可能你最常用的不在這個列表,北哥建議初學者對這些函數一一仔細研究。分析最常用的函數是字符串函數,然后是數組,然后是文件。以上個函數沒有近期要丟棄的計劃。數據庫操作也不納入此排名。 這是一篇外文,翻譯給大家。原作者分析了1900多個項目對php函數的使用情況得到如下結果,當然有可能你最常用的不在這個列表,北哥建議PHP初學者對這些函...
閱讀 4376·2021-11-24 10:24
閱讀 1412·2021-11-22 15:22
閱讀 2042·2021-11-17 09:33
閱讀 2446·2021-09-22 15:29
閱讀 520·2019-08-30 15:55
閱讀 1658·2019-08-29 18:42
閱讀 2737·2019-08-29 12:55
閱讀 1777·2019-08-26 13:55