W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
在很多情況下,我們都需要緩存。如對(duì)重復(fù)獲取但變化不大的數(shù)據(jù)進(jìn)行緩存以提供服務(wù)器的響應(yīng)能力,又如當(dāng)需要為數(shù)據(jù)庫(kù)服務(wù)器減少Q(mào)PS時(shí)等等。但同時(shí)緩存也因?yàn)橛醒訒r(shí)導(dǎo)致數(shù)據(jù)不能實(shí)時(shí)更新,或者在需要更新時(shí)不能被更新。如在接口調(diào)試、單元測(cè)試或者預(yù)覽時(shí),但這些都可以通過(guò)一些技巧來(lái)獲得。這里,將從簡(jiǎn)單的緩存、再到高速緩存、多級(jí)緩存逐步進(jìn)行說(shuō)明。
這里所指的簡(jiǎn)單緩存,是指文件緩存。因?yàn)閷?shí)現(xiàn)簡(jiǎn)單,且部署方便。但其缺點(diǎn)也是明顯的,如文件I/O讀寫導(dǎo)致性能低,不能支持分布式。所以在沒(méi)有集群服務(wù)器下是適用的。
當(dāng)需要使用文件緩存時(shí),先對(duì)文件緩存進(jìn)行DI注冊(cè),便可使用。
//$ vim ./Public/init.php
DI()->cache = new PhalApi_Cache_File(array('path' => API_ROOT . '/Runtime', 'prefix' => 'demo'));
// 設(shè)置
DI()->cache->set('thisYear', 2015, 600);
// 獲取
echo DI()->cache->get('thisYear');
// 刪除
DI()->cache->delete('thisYear');
高速緩存通常具備分布式的能力,并能進(jìn)駐內(nèi)存,因此性能高。但同樣此優(yōu)點(diǎn)所帶來(lái)的則是需要另外部署緩存擴(kuò)展,如常見的Memcached、Redis。若需要考慮緩存落地,還要進(jìn)一點(diǎn)篩選和配置。
如使用Memcached:
DI()->cache = new PhalApi_Cache_Memcached(array('host' => '127.0.0.1', 'port' => 11211, 'prefix' => 'demo_'));
// 設(shè)置
DI()->cache->set('thisYear', 2015, 600);
// 獲取
echo DI()->cache->get('thisYear');
// 刪除
DI()->cache->delete('thisYear');
從上面示例代碼注意到,我們使用了前綴配置,以防同一臺(tái)MC服務(wù)器同一端口下key名沖突。當(dāng)然,更好是使用配置文件來(lái)配置緩存的地址和端口,以及前綴。
然而,很多時(shí)候,我們需要多級(jí)緩存來(lái)承載更大的訪問(wèn)量。以便結(jié)合本地低速緩存和分布式高速緩存來(lái)獲得更好的用戶體驗(yàn)和服務(wù)器吞吐率。這時(shí),則可以使用多級(jí)緩存策略。
在切換到多級(jí)緩存時(shí),我們明顯希望原有的代碼調(diào)用不需要同步調(diào)整便能獲得升級(jí)后的多級(jí)緩存,并且我們后臺(tái)開發(fā)人員也希望可以輕便在原有的單點(diǎn)緩存的基礎(chǔ)上進(jìn)行擴(kuò)展。所以這就引出了一個(gè)有趣的問(wèn)題:我們?cè)撊绾谓M織多級(jí)緩存?
作為一個(gè)框架,除了考慮上述的原有調(diào)用、單點(diǎn)緩存復(fù)用外,還需要考慮到多級(jí)緩存的組裝。部分框架,一如我最喜歡的Phalcon則是使用了配置的形式來(lái)實(shí)現(xiàn)。但仍然,我們需要了解其配置的各個(gè)格式要求才能更好掌握和使用,這點(diǎn)帶來(lái)了學(xué)習(xí)的成本。因此,PhalApi則是使用了簡(jiǎn)單的組合模式來(lái)實(shí)現(xiàn)。
正如你在源代碼中看到的PhalApi_Cache_Multi類,通過(guò)此類的實(shí)例可以利用PhalApi_Cache_Multi::addCache()快速添加一個(gè)緩存節(jié)點(diǎn),而節(jié)點(diǎn)的優(yōu)先級(jí)則按開發(fā)同學(xué)添加的順序來(lái)確定。顯然在添加時(shí),我們應(yīng)該先添加分布式的高速緩存,再添加本地的低速緩存(希望不會(huì)有人先添加文件緩存再添加MC緩存)。而各個(gè)節(jié)點(diǎn)的初始化,則是我們之前所熟悉的。只是簡(jiǎn)單添加即可。
以下是結(jié)合文件緩存和MC緩存的多級(jí)緩存示例:
$cache = PhalApi_Cache_Multi();
$mcCache = new PhalApi_Cache_Memcached(array('host' => '127.0.0.1', 'port' => 11211, 'prefix' => 'demo_'));
$cache->addCache($mcCache);
$fileCache = new PhalApi_Cache_File(array('path' => API_ROOT . '/Runtime', 'prefix' => 'demo'));
$cache->addCache($fileCache);
DI()->cache = $cache;
然后,就可像之前那樣設(shè)置、獲取和刪除緩存,而不需考慮是單點(diǎn)緩存,還是多級(jí)緩存:
// 設(shè)置
DI()->cache->set('thisYear', 2015, 600);
// 獲取
echo DI()->cache->get('thisYear');
// 刪除
DI()->cache->delete('thisYear');
對(duì)應(yīng)地,我們可以得出清晰明了的UML靜態(tài)結(jié)構(gòu)圖:
結(jié)構(gòu)層次非常簡(jiǎn)單,但主要分為三大類:左邊是多級(jí)緩存;中間突出的是特殊情況,即:空對(duì)象模式下的空緩存;右邊是目前已提供或者后期擴(kuò)展的具體緩存實(shí)現(xiàn)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: