2011-04-28 68 views
6

我開始使用Zend緩存(APC後端),一切都很好在返回的緩存值,而不是每次都命中數據庫的條款。然而,我的繼承人問題:模式清除緩存的Zend

$cache_key = 'getrebates_'.$operator_code; 

if(PP_Model_CacheService::exists($cache_key)) { 
    $cached_values = PP_Model_CacheService::load($cache_key); 
} else { 
    //hits the db  
    $cached_values = $this->getAll($operator_code); 
    PP_Model_CacheService::save($cached_values, $cache_key); 
} 
return $cached_values; 

每個運營商都有自己的回扣,其運營商之間的不同,現在如果我更改了數據庫,並需要明確的回扣爲所有運營商,我會怎麼做呢?

我可以使用$ Cache-> clean(),但這會清除其他緩存(不僅僅是每個操作員的回扣緩存)。如果我通過所有的運營商循環:

foreach($operator_codes AS $operator_code) { 
    $cache_key = 'getrebates_'.$operator_code; 
    $cache->delete($cache_key) 
} 

這似乎很多工作的緩存。有沒有辦法只清除緩存的一部分?

//Something like: 
$section_key = 'getrebates'; 
$Cache[$section_key][$operator_code]; 
$Cache->clearSection($section_key); 

是否有任何陣列結構的APC緩存或是所有緩存鍵/值的基礎?

回答

10

您可以將標籤存儲在緩存中的值。這樣你可以很容易地刪除所有具有特定標籤的緩存條目。

$cache->save($huge_data, 'myUniqueID', array('tagA', 'tagB')); 

// clear all cache entries with tag tagA or tagC 
$cache->clean(
    Zend_Cache::CLEANING_MODE_MATCHING_TAG, 
    array('tagA', 'tagC') 
); 

請參閱本頁面:http://framework.zend.com/manual/en/zend.cache.theory.html以及有關Zend_Cache_Core的清潔方法的詳細信息API:http://framework.zend.com/apidoc/1.11/

+2

除了APC ...... – regilero 2011-04-30 22:12:14

+0

感謝您的時間公爵。正如Regilero指出的,APC不支持標籤。在這種情況下,您會使用哪個後端來支持標籤? – 2011-05-02 14:27:09

+0

我們在談論多少個緩存條目? 如果其10或20我只是刪除每個條目。 根據您的需要,您可以考慮將序列化關聯數組保存到緩存中,而不是單個條目。這不,如果你有更新/刪除單個條目時常想起 – theduke 2011-05-05 09:23:33

4

@theduke是正確的,標記是做正確的方式,除了APC,作爲Zend_Cache_Backend_Apc不支持標籤。從the doc

注意:這個後端,「標籤」 不支持的時刻

從你最後的評論是中小型企業使用的是APC作爲後端。因此,無論你擴展這個類並添加標籤的行爲(在標籤標識添加了特殊的語法?通過處理標籤VS緩存條目映射別的地方?在一個長期的緩存條目?),或者你決定使用另一個緩存後端。

+0

哪個後端支持標籤是一個好主意?看起來大多數後端不是來自http://framework.zend.com/manual/en/zend.cache.backends.html的Zend手冊 – 2011-05-04 14:12:51

+0

,你可以看到標籤可用於文件後端,SQLite後端和部分在ZendPlatform上。 – regilero 2011-05-04 17:54:16