您好,登錄后才能下訂單哦!
這篇文章主要介紹了PHP中另一個高效緩存擴(kuò)展Yac的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
之前的文章中我們已經(jīng)學(xué)習(xí)過一個 PHP 自帶的擴(kuò)展緩存 Apc ,今天我們來學(xué)習(xí)另一個緩存擴(kuò)展:Yac 。
從名字其實就能看出,這又是鳥哥大神的作品。畢竟是 PHP 的核心開發(fā)人員,他的作品每次都不會讓我們失望。鳥哥可以說是我們中國程序員的驕傲,他在 PHP 界有舉足輕重的地位,大家可以自己搜索一下他的博客,雖說更新頻率不高,但每篇文章都值得我們學(xué)習(xí)。
Yac 是一個無鎖共享緩存系統(tǒng),因為無鎖,所以它的效率非常高。據(jù)說 Apc 的效率是 Memcached 的一倍以上,而 Yac 比 Apc 更快。這就是它最大的特點。
相對于 Memcached 或者 Redis 來說,Yac 更加輕量級,我們也不需要在服務(wù)器中再安裝別的什么軟件,只需要安裝這個擴(kuò)展就可以使用。對于小型系統(tǒng)特別是就是簡單的進(jìn)行數(shù)據(jù)緩存的系統(tǒng)來說,我們不需要復(fù)雜的數(shù)據(jù)類型,只用這種程序語言的擴(kuò)展就能讓我們的開發(fā)更為方便快捷。
安裝的方式也非常簡單,一樣的在 PECL 下載安裝包后進(jìn)行擴(kuò)展安裝即可。
對于緩存相關(guān)的操作,無外乎就是添加、修改、刪除緩存。不像外部緩存系統(tǒng),在保存數(shù)組或?qū)ο髸r,PHP 擴(kuò)展類的緩存都能直接保存這些數(shù)據(jù)類型,而不用序列化為字符串或者轉(zhuǎn)化為 JSON 字符串,這是 Apc 和 Yac 的優(yōu)勢之一。
$yac = new Yac(); $yac->add('a', 'value a'); $yac->add('b', [1,2,3,4]); $obj = new stdClass; $obj->v = 'obj v'; $yac->add('obj', $obj); echo $yac->get('a'), PHP_EOL; // value a echo $yac->a, PHP_EOL; // value a print_r($yac->get('b')); // Array // ( // [0] => 1 // [1] => 2 // [2] => 3 // [3] => 4 // ) var_dump($yac->get('obj')); // object(stdClass)#3 (1) { // ["v"]=> // string(5) "obj v" // }
非常簡單的操作,我們只需要實例化一個 Yac 類,就可以通過 add() 方法及 get() 方法添加和獲取緩存內(nèi)容。
Yac 擴(kuò)展還重寫了 __set() 和 __get() 魔術(shù)方法,所以我們可以直接通過操作變量的方式來操作緩存。
接下來,我們可以通過 info() 函數(shù)查看當(dāng)前緩存的狀態(tài)信息。
print_r($yac->info()); // Array // ( // [memory_size] => 71303168 // [slots_memory_size] => 4194304 // [values_memory_size] => 67108864 // [segment_size] => 4194304 // [segment_num] => 16 // [miss] => 0 // [hits] => 4 // [fails] => 0 // [kicks] => 0 // [recycles] => 0 // [slots_size] => 32768 // [slots_used] => 3 // )
$yac->set('a', 'new value a!'); echo $yac->a, PHP_EOL; // new value a! $yac->a = 'best new value a!'; echo $yac->a, PHP_EOL; // best new value a!
set() 函數(shù)的作用就是如果當(dāng)前緩存 key 存在,就修改這個緩存的內(nèi)容,如果不存在,就創(chuàng)建一個緩存。
$yac->delete('a'); echo $yac->a, PHP_EOL; // $yac->flush(); print_r($yac->info()); // Array // ( // [memory_size] => 71303168 // [slots_memory_size] => 4194304 // [values_memory_size] => 67108864 // [segment_size] => 4194304 // [segment_num] => 16 // [miss] => 1 // [hits] => 6 // [fails] => 0 // [kicks] => 0 // [recycles] => 0 // [slots_size] => 32768 // [slots_used] => 0 // )
對于單個緩存的刪除,我們可以直接使用 delete() 函數(shù)來刪除這個緩存的內(nèi)容。如果要清空整個緩存空間,就可以直接使用 flush() 來清空整個緩存空間。
上面我們提到了 緩存空間 這個東西。其實也就是在實例化 Yac 的時候可以給默認(rèn)的 Yac 類構(gòu)造函數(shù)傳遞一個別名配置。這樣,不同的 Yac 實例就相當(dāng)于放在了不同的命名空間中,相同的 Key 的緩存在不同的空間中就不會相互影響。
$yacFirst = new Yac(); $yacFirst->a = 'first a!';; $yacSecond = new Yac(); $yacSecond->a = 'second a!'; echo $yacFirst->a, PHP_EOL; // second a! echo $yacSecond->a, PHP_EOL; // second a!
這段代碼我們都是使用的默認(rèn)的實例化 Yac 對象,雖說是分開實例化的,但它們保存的空間是一樣的,所以相同的 a 變量會相互覆蓋。
$yacFirst = new Yac('first'); $yacFirst->a = 'first a!';; $yacSecond = new Yac('second'); $yacSecond->a = 'second a!'; echo $yacFirst->a, PHP_EOL; // first a! echo $yacSecond->a, PHP_EOL; // second a!
當(dāng)我們使用不同的實例化參數(shù)之后,相同的 a 就不會相互影響,它們被存儲在了不同的空間中。或者說,Yac 會自動給這些 Key 增加一個 prefix 。
最后,緩存系統(tǒng)都會針對緩存內(nèi)容有時效限制,如果指定了過期時間,緩存內(nèi)容就會在指定的時間之后過期。
$yac->add('ttl', '10s', 10); $yac->set('ttl2', '20s', 20); echo $yac->get('ttl'), PHP_EOL; // 10s echo $yac->ttl2, PHP_EOL; // 20s sleep(10); echo $yac->get('ttl'), PHP_EOL; // echo $yac->ttl2, PHP_EOL; // 20s
上述代碼中的 ttl 緩存只設(shè)置了 10 秒的過期時間,所以在 sleep() 10 秒后,輸出 ttl 就沒有任何內(nèi)容了。
需要注意的是,對于時間的設(shè)置,如果不設(shè)置的話就是長久有效,而且不能用 __set() 方法設(shè)置過期時間,只能使用 set() 或者 add() 函數(shù)來設(shè)置過期時間。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“PHP中另一個高效緩存擴(kuò)展Yac的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。