成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

北哥大話Yii2緩存機(jī)制 - File緩存

cnTomato / 2358人閱讀

摘要:講的好長作為北哥大話緩存機(jī)制第一篇,希望大家喜歡,為了一段日子里我會專注于分享的緩存機(jī)制。

有的兄弟一定會說,F(xiàn)ile緩存有什么好講的那?不就是一個set,然后在一個get么?那你知道的只是皮毛~

的確如大家所說,緩存從表現(xiàn)層看就是一個set(放數(shù)據(jù)),然后再一個get(拿數(shù)據(jù)),但是請記住,這樣是不夠的,如果你不了解每個緩存的實現(xiàn)原理、存儲特點等等,你是無法使用對場景的,什么時候用File緩存、什么時候用DB緩存、什么時候用Memcache緩存,這些才是我們要學(xué)的。

依然先寫目錄

FileCache的定義

FileCache的基本用法

FileCache存儲內(nèi)容時的邏輯實現(xiàn)

FileCache的定義

可能一句話就可以說明白,將某些數(shù)據(jù)存到文件中,下次讀取的時候直接從文件中讀,分流壓力。

基本用法

為了統(tǒng)一接口,yii2將所有類型的緩存都統(tǒng)一成以下這些方法。

get() // 根據(jù)一個指定的key獲取緩存值,如果緩存不存在或已經(jīng)過期則返回false
set() // 直接保存一個值到緩存(不考慮是否存在,直接替換)
add() // 如果此刻緩存不存在則保存,否則忽略
multiGet() // 一次獲取多個key的緩存值,參數(shù)為一個key的數(shù)組["key1","key2"],返回值也是一個數(shù)組["key1"=>"valuw1","key2"=>"value2"]
multiSet() // 一次存儲多個緩存
mulitAdd() // 一次添加多個緩存
delete() // 刪除某個緩存
flush() // 刪除所有緩存

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

exists()
getOrSet()

exists($key)
顧名思義,檢查一個緩存是否存在(緩存過期 = 過期)。對于這個函數(shù)要注意以下幾點

當(dāng)緩存的數(shù)據(jù)量很大時,使用exists要比get快,但是如果緩存沒有原生的exists,則exists會去模擬一下,這種情況下exists不會比get有性能提高,F(xiàn)ileCache 的exists未有提升。

exists并不會檢查緩存依賴,所以如果一個緩存有依賴而依賴的變化導(dǎo)致我們通過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);
}

這個函數(shù)的用意是簡單的-如果有則獲取,沒有則建立,但是其中的$closure要提一下,它接收一個閉包。閉包是php5.3引入的一個新概念,如果不知道的可以用下面網(wǎng)址補(bǔ)課一下
http://www.cnblogs.com/melonb...

于是我們就可以寫一個你可能不常見的緩存代碼

$cache->getOrSet(["user","id"=>$id],function($cache) use ($id){
    return User::findOne($id);
});

緩存每一個會員的信息,使用use,最少代碼量。

以上就是yii2 Cache對支持的所有緩存統(tǒng)一的10個方法,下面我們會針對FileCache進(jìn)行一些原理性說明,為了方便大家閱讀,我們用問答模式。

重點要說的

上帝問: 北哥,看文檔我看什么get、set、getOrSet的key除了一個字符串,還能接收一個數(shù)據(jù)結(jié)構(gòu),是什么意思?

北哥答:是的,你說的不錯,比如我們現(xiàn)在要緩存每個文章,我們可以使用以下兩個方法

// key是string的
$cache->set("article-1",$data);
// key是結(jié)構(gòu)體,比如數(shù)組
$cache->set(["article","id"=>1],$data);

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


上帝問: 是的北哥,您說的對,比如我的key=abc,那么存儲的時候是如何根據(jù)key來建立文件夾或緩存文件的那,他們是如何命名的那?

北哥答: yii對于文件緩存key的處理如下,我用偽代碼回答你。

//    對用戶緩存定義的key進(jìn)行再加工
if($key == 字符串){
    if($key字符串只含有數(shù)字或字母 && $key的長度 <= 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);

語句1會生成一個123.bin的緩存文件,因為"123"是字符串,而語句2的123是數(shù)字,會生成md5(123)后的.bin文件。

現(xiàn)在你明白了文件命名規(guī)則,我想上帝你一定也被那些13、59、a3、le這樣的文件夾弄暈了吧,再仔細(xì)看一下,是的,你發(fā)現(xiàn)了。。。

是文件名的前兩個字母

恭喜你,這是一個多么準(zhǔn)確且偉大的發(fā)現(xiàn)。但是,我想你也一定見過這樣的緩存目錄

目錄不止一級,很多級,這樣是有道理的,可以保證一個文件夾內(nèi)文件不會過多,但是這個是如何實現(xiàn)的那?

這僅僅是一個變量決定,它叫directoryLevel(默認(rèn)為1)

$cache->directoryLevel = 3;

當(dāng)然你也可以在web的cache里配置,還是按照你剛才發(fā)現(xiàn)的密碼,如果directoryLevel=3,則把文件名從頭開始,每2字符個做一個文件夾(如果文件名只有3個字符,則建立到第二個的時候停止就好了)。

好的上帝,現(xiàn)在你明白了吧~


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

北哥答: 必須的了,你可以使用一個叫做keyPrefix的變量,它為你的緩存文件名字加一個前綴,看代碼

$cache->keyPrefix = "nai8_";
$cache->set("hello","hello keyPrefix");

結(jié)果如下

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


上帝問: 我基本都明白了,再問你一個問題,回答完后我就回花果山了,就是比如我寫了$cache->set("a","abc",1000),但是當(dāng)我get的時候,yii怎么知道到了1000秒,已經(jīng)過期還是沒過期那,我看文件內(nèi)容里沒有1000這個數(shù)字啊,到底存在什么地方?

北哥答: 你說的沒錯,這要介紹一個php的函數(shù)了 --- touch(),這個函數(shù)可以修改一個文件的上一次修改時間,當(dāng)我們執(zhí)行 $cache->set("a","abc",1000)時候,yii的FileCache做了一件事情,看代碼

touch("緩存文件",(time() + 1000));

你明白了吧,當(dāng)我們讀的時候,只需要判斷filetime("緩存文件")的上次修改時間是否大于現(xiàn)在time(),不就可以了么,多簡單的事情。

OMG~ Fly fly fly ......

可是我還沒說完~

下面開始北哥自言自語一小段,講講緩存依賴(set、add、getOrSet都有這個參數(shù)),什么意思那,簡單的說就是一個緩存和某個東東有關(guān)聯(lián),當(dāng)這個東東發(fā)生變化時,則這個緩存失效(既是當(dāng)前過期時間還沒到)

因為篇幅問題,我們這里先說一個Cache的數(shù)據(jù)庫依賴,以后會在“北哥大話Yii2緩存機(jī)制”多帶帶拿出一篇來講各種依賴。

$dependency = new yiicachingDbDependency(
    ["sql" => "SELECT count(*) FROM user"]
);
// 當(dāng)數(shù)據(jù)庫字段發(fā)生變化時,該緩存失效
$cache->add("three", "hello world!", 3000, $dependency);

依賴還是蠻有用的,比如一些統(tǒng)計數(shù)據(jù)的顯示做緩存,當(dāng)數(shù)據(jù)變化時緩存數(shù)據(jù)能得到及時的更新。

講的好長~作為“北哥大話Yii2緩存機(jī)制”第一篇,希望大家喜歡,為了一段日子里我會專注于分享yii2的緩存機(jī)制。

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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/61860.html

相關(guān)文章

  • 北哥大話Yii2緩存機(jī)制 - DbCache

    摘要:數(shù)據(jù)庫緩存并不麻煩,基本用法依然符合緩存的統(tǒng)一接口,具體方法可以在里查看。會被的函數(shù)引用,該函數(shù)被和觸發(fā)。 數(shù)據(jù)庫緩存并不麻煩,基本用法依然符合yii2緩存的統(tǒng)一接口,具體方法可以在 http://nai8.me/sapper-view.ht... 里查看。 如果要啟動數(shù)據(jù)庫緩存,必須要有一個數(shù)據(jù)庫及數(shù)據(jù)表,這些可以通過cache的配置文件完成 cache => [ class...

    PAMPANG 評論0 收藏0
  • 北哥大話Yii2緩存機(jī)制 - 緩存依賴

    摘要:我們都知道,的緩存是支持依賴的,就是我們設(shè)置的緩存是否失效除了過期時間還決定于它所依賴的東東是否變化。用好依賴將大大提高我們使用緩存的效果,本節(jié)講解緩存的種依賴方式?,F(xiàn)在我們?nèi)匀煌ㄟ^一個例子說明,假設(shè)我們的一個緩存同時依賴于兩個依賴。 我們都知道,yii2的緩存是支持依賴的,就是我們設(shè)置的緩存是否失效除了過期時間還決定于它所依賴的東東是否變化。 用好依賴將大大提高我們使用緩存的效果,本...

    klivitamJ 評論0 收藏0
  • Yii2中的代碼自動加載機(jī)制

    摘要:中是如何實現(xiàn)代碼的自動加載的入口腳本的以下兩行代碼其中的作用注冊為自動加載函數(shù)。這個負(fù)責(zé)引入了一個類中的,隨后立即解除注冊。注冊中的為自動加載函數(shù),并利用配置文件即目錄下的文件對這個自動加載函數(shù)進(jìn)行了初始化。 1.基本知識 Include與require 的作用: 當(dāng)一個文件被包含時,其中所包含的代碼繼承了 include 所在行的變量范圍。從該處開始,調(diào)用文件在該行處可用的任何...

    Jaden 評論0 收藏0
  • PHP最常用函數(shù)TOP100(翻譯)

    摘要:原作者分析了多個項目對函數(shù)的使用情況得到如下結(jié)果,當(dāng)然有可能你最常用的不在這個列表,北哥建議初學(xué)者對這些函數(shù)一一仔細(xì)研究。分析最常用的函數(shù)是字符串函數(shù),然后是數(shù)組,然后是文件。以上個函數(shù)沒有近期要丟棄的計劃。數(shù)據(jù)庫操作也不納入此排名。 這是一篇外文,翻譯給大家。原作者分析了1900多個項目對php函數(shù)的使用情況得到如下結(jié)果,當(dāng)然有可能你最常用的不在這個列表,北哥建議PHP初學(xué)者對這些函...

    _ipo 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<