緩存策略:更靈活地可配置化的多級緩存

2018-11-21 21:17 更新

1.24.1 論緩存的重要性

在很多情況下,我們都需要緩存。如對重復(fù)獲取但變化不大的數(shù)據(jù)進行緩存以提供服務(wù)器的響應(yīng)能力,又如當(dāng)需要為數(shù)據(jù)庫服務(wù)器減少Q(mào)PS時等等。但同時緩存也因為有延時導(dǎo)致數(shù)據(jù)不能實時更新,或者在需要更新時不能被更新。如在接口調(diào)試、單元測試或者預(yù)覽時,但這些都可以通過一些技巧來獲得。這里,將從簡單的緩存、再到高速緩存、多級緩存逐步進行說明。

1.24.2 簡單緩存

這里所指的簡單緩存,是指文件緩存。因為實現(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');

1.24.3 高速緩存

高速緩存通常具備分布式的能力,并能進駐內(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)然,更好是使用配置文件來配置緩存的地址和端口,以及前綴。

1.24.4 多級緩存

然而,很多時候,我們需要多級緩存來承載更大的訪問量。以便結(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');

1.24.5 靜態(tài)結(jié)構(gòu)圖

對應(yīng)地,我們可以得出清晰明了的UML靜態(tài)結(jié)構(gòu)圖:

多級緩存靜態(tài)結(jié)構(gòu)圖

結(jié)構(gòu)層次非常簡單,但主要分為三大類:左邊是多級緩存;中間突出的是特殊情況,即:空對象模式下的空緩存;右邊是目前已提供或者后期擴展的具體緩存實現(xiàn)。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號