PHP的另乙個高效快取擴充套件 Yac

2021-10-09 13:34:06 字數 4026 閱讀 3918

從名字其實就能看出,這又是鳥哥大神的作品。畢竟是 php 的核心開發人員,他的作品每次都不會讓我們失望。鳥哥可以說是我們中國程式設計師的驕傲,他在 php 界有舉足輕重的地位,大家可以自己搜尋一下他的部落格,雖說更新頻率不高,但每篇文章都值得我們學習。

yac 是乙個無鎖共享快取系統,因為無鎖,所以它的效率非常高。據說 apc 的效率是 memcached 的一倍以上,而 yac 比 apc 更快。這就是它最大的特點。

相對於 memcached 或者 redis 來說,yac 更加輕量級,我們也不需要在伺服器中再安裝別的什麼軟體,只需要安裝這個擴充套件就可以使用。對於小型系統特別是就是簡單的進行資料快取的系統來說,我們不需要複雜的資料型別,只用這種程式語言的擴充套件就能讓我們的開發更為方便快捷。

對於快取相關的操作,無外乎就是新增、修改、刪除快取。不像外部快取系統,在儲存陣列或物件時,php 擴充套件類的快取都能直接儲存這些資料型別,而不用序列化為字串或者轉化為 json 字串,這是 apc 和 yac 的優勢之一。

$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)

非常簡單的操作,我們只需要例項化乙個 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 一樣方便好用,當然,更主要的是它的效能以及適用場景。對於小系統,特別是機器配置不是那麼強的操作環境中,這種擴充套件型的快取系統能夠讓我們的開發更加的快捷方便。關於無鎖共享的概念我們可以參考下方參考文件中第二個鏈結,也就是鳥哥的文章中有詳細的說明。

測試**:

另乙個自己

人們常說 人貴有自知之明 可是話說回來,又有幾人能真正的了解自己呢?我覺得我就是乙個很沒有自知之明的人。生於89年的我,到了今年的生日就28周歲了。都說三十而立,正所謂成家立業,可以回過頭發現自己可以稱得上 一無是處,一無所有 曾幾何時,還是鄰居家叔叔阿姨教育孩子的榜樣 曾幾何時父母因為自己考個好大...

PHP利用include呼叫另乙個PHP檔案的方法

連線資料庫,並且建立持久化的pdo連線以及捕捉錯誤異常 function mysql pdo dbname is username is password is catch pdoexception e mysql pdo new pdo dsn username password params r...

呼叫另乙個Activity

1 建立主activity 注意通過權重來分配尺寸的方式 元件1 android layout width 0dp android layout weight 1 元件2 android layout width wrap content 2 在主類中指定onclick所對應的sendmessage...