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