PHP的另外一個高效緩存擴展:Yac

PHP的另外一個高效緩存擴展:Yac

以前的文章中咱們已經學習過一個 PHP 自帶的擴展緩存 Apc ,今天咱們來學習另外一個緩存擴展:Yac 。php

什麼是 Yac

從名字其實就能看出,這又是鳥哥大神的做品。畢竟是 PHP 的核心開發人員,他的做品每次都不會讓咱們失望。鳥哥能夠說是咱們中國程序員的驕傲,他在 PHP 界有舉足輕重的地位,你們能夠本身搜索一下他的博客,雖然說更新頻率不高,但每篇文章都值得咱們學習。html

Yac 是一個無鎖共享緩存系統,由於無鎖,因此它的效率很是高。聽說 Apc 的效率是 Memcached 的一倍以上,而 Yac 比 Apc 更快。這就是它最大的特色。git

相對於 Memcached 或者 Redis 來講,Yac 更加輕量級,咱們也不須要在服務器中再安裝別的什麼軟件,只須要安裝這個擴展就能夠使用。對於小型系統特別是就是簡單的進行數據緩存的系統來講,咱們不須要複雜的數據類型,只用這種程序語言的擴展就能讓咱們的開發更爲方便快捷。程序員

安裝的方式也很是簡單,同樣的在 PECL 下載安裝包後進行擴展安裝便可。github

基本操做

對於緩存相關的操做,無外乎就是添加、修改、刪除緩存。不像外部緩存系統,在保存數組或對象時,PHP 擴展類的緩存都能直接保存這些數據類型,而不用序列化爲字符串或者轉化爲 JSON 字符串,這是 Apc 和 Yac 的優點之一。web

添加、獲取緩存

$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() 方法添加和獲取緩存內容。數組

Yac 擴展還重寫了 __set() 和 __get() 魔術方法,因此咱們能夠直接經過操做變量的方式來操做緩存。緩存

接下來,咱們能夠經過 info() 函數查看當前緩存的狀態信息。服務器

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() 函數的做用就是若是當前緩存 key 存在,就修改這個緩存的內容,若是不存在,就建立一個緩存。微信

刪除緩存

$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() 函數來刪除這個緩存的內容。若是要清空整個緩存空間,就能夠直接使用 flush() 來清空整個緩存空間。

別名空間

上面咱們提到了 緩存空間 這個東西。其實也就是在實例化 Yac 的時候能夠給默認的 Yac 類構造函數傳遞一個別名配置。這樣,不一樣的 Yac 實例就至關於放在了不一樣的命名空間中,相同的 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!

這段代碼咱們都是使用的默認的實例化 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!

當咱們使用不一樣的實例化參數以後,相同的 a 就不會相互影響,它們被存儲在了不一樣的空間中。或者說,Yac 會自動給這些 Key 增長一個 prefix 。

緩存時效

最後,緩存系統都會針對緩存內容有時效限制,若是指定了過時時間,緩存內容就會在指定的時間以後過時。

$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 緩存只設置了 10 秒的過時時間,因此在 sleep() 10 秒後,輸出 ttl 就沒有任何內容了。

須要注意的是,對於時間的設置,若是不設置的話就是長久有效,並且不能用 __set() 方法設置過時時間,只能使用 set() 或者 add() 函數來設置過時時間。

總結

怎麼樣,Yac 擴展是否是和咱們的 Apc 同樣方便好用,固然,更主要的是它的性能以及適用場景。對於小系統,特別是機器配置不是那麼強的操做環境中,這種擴展型的緩存系統可以讓咱們的開發更加的快捷方便。關於無鎖共享的概念咱們能夠參考下方參考文檔中第二個連接,也就是鳥哥的文章中有詳細的說明。

測試代碼:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202006/source/PHP%E7%9A%84%E5%8F%A6%E4%B8%80%E4%B8%AA%E9%AB%98%E6%95%88%E7%BC%93%E5%AD%98%E6%89%A9%E5%B1%95%EF%BC%9AYac.php

參考文檔:

https://www.php.net/manual/zh/book.yac.php

https://www.laruence.com/2013/03/18/2846.html

https://www.cnblogs.com/sunsky303/p/6554888.html


本文分享自微信公衆號 - 硬核項目經理(fullstackpm)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索