libshmcache本地緩存庫(kù)
libshmcache是基于共享內(nèi)存的本地緩存庫(kù),可以在多個(gè)非親緣關(guān)系的進(jìn)程間共享緩存。libshmcache寫有鎖,讀無(wú)鎖,性能非常高。libshmcache直接訪問(wèn)本地共享內(nèi)存,速度比遠(yuǎn)程接口如redis快100倍以上。
libshmcache包含C庫(kù)和PHP擴(kuò)展(支持PHP 5和PHP 7)。在眾多開(kāi)源緩存軟件的今天,libshmcache作為后起之秀,憑借諸多特性,有望成為本地緩存開(kāi)源軟件的一顆明星。
1. 高性能特性
1)寫采用pthread互斥鎖,讀無(wú)鎖;
2)使用hash table進(jìn)行快速set、get和delete;
3)使用對(duì)象池(FIFO隊(duì)列)對(duì)hash table鍵值對(duì)進(jìn)行分配;
4)value buffer分配使用striping(條帶化)分配機(jī)制,在striping內(nèi)按順序分配buffer。當(dāng)釋放value buffer時(shí),只需要減少striping已使用空間(used size)。釋放value buffer后,若striping已使用空間變?yōu)?,回收整個(gè)striping;
5)淘汰算法使用簡(jiǎn)單高效的FIFO而不是LRU。
2. 穩(wěn)定性特性
1)死鎖檢測(cè)和自動(dòng)解鎖機(jī)制。死鎖發(fā)生場(chǎng)景:正在修改數(shù)據(jù)的進(jìn)程掛掉,會(huì)導(dǎo)致死鎖;
2)初始化時(shí)檢查一些關(guān)鍵字段的一致性,當(dāng)內(nèi)存相關(guān)的參數(shù)發(fā)生變化時(shí),系統(tǒng)會(huì)自動(dòng)提示共享內(nèi)存需要清理和重新初始化;
3)當(dāng)回收了有效的(未過(guò)期)鍵值對(duì)時(shí),休眠一定時(shí)長(zhǎng)以避免其他進(jìn)程讀到臟數(shù)據(jù)。
3. 其他特性
1)除了支持有親緣關(guān)系的進(jìn)程(如父進(jìn)程和子進(jìn)程),還支持無(wú)親緣關(guān)系的進(jìn)程(如PHP FPM進(jìn)程和PHP CLI進(jìn)程,多個(gè)PHP CLI進(jìn)程等等);
2)按需增量分配value buffer,有效減少初始內(nèi)存大小,避免內(nèi)存浪費(fèi)(通過(guò)配置參數(shù)segment_size來(lái)設(shè)置);
3)提供豐富的統(tǒng)計(jì)信息:get,set和delete次數(shù)統(tǒng)計(jì)、緩存命中率、內(nèi)存回收統(tǒng)計(jì)、鎖使用統(tǒng)計(jì)等;
4)支持原子增加(減少);
5)PHP擴(kuò)展支持多種序列化方式:igbinary、msgpack、PHP序列化,以及無(wú)需序列化。因?yàn)殒I值對(duì)中存儲(chǔ)了所用的序列化方式,這幾種序列化方式可以并存;
* 友情提示:key長(zhǎng)度不能超過(guò)64字節(jié)。
libshmcache使用場(chǎng)景
如果需要緩存的數(shù)據(jù)量不是太大,比如不超過(guò)100w個(gè)key,對(duì)緩存讀寫性能要求又比較高的情況下,可以考慮使用libshmcache??偨Y(jié)為一句話:追求極致性能,以空間換時(shí)間。
