2011-04-28 29 views
6

मैंने ज़ेंड कैश (एपीसी बैकएंड) का उपयोग करना शुरू किया और सभी डेटाबेस को हर बार मारने के बजाय कैश किए गए मानों को वापस करने के मामले में अच्छी तरह से हैं। हालांकि, यहाँ मेरी समस्या:ज़ेंड कैश को साफ़ करने के लिए पैटर्न

$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; 

अगर मैं डेटाबेस बदल सकते हैं और सभी ऑपरेटरों के लिए छूट साफ़ करने की आवश्यकता प्रत्येक ऑपरेटर अब अपने स्वयं छूट जो ऑपरेटरों के बीच में भिन्नता है, है, मैं कैसे इस करना होगा?

मैं $ कैश-> साफ() का उपयोग कर सकता हूं, लेकिन यह अन्य कैश को साफ़ करेगा (न केवल प्रत्येक ऑपरेटर के लिए छूट कैश)। अगर मैं सभी ऑपरेटरों के माध्यम से लूप करता हूं:

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); 

क्या एपीसी कैश में कोई सरणी संरचना है या क्या यह सभी कैश कुंजी/मान आधारित है?

उत्तर

10

आप कैश में संग्रहीत मूल्यों पर टैग लागू कर सकते हैं। इस तरह आप आसानी से सभी कैश प्रविष्टियों को हटा सकते हैं जिनमें एक निश्चित टैग है। http://framework.zend.com/manual/en/zend.cache.theory.html और Zend_Cache_Core की साफ विधि के बारे में जानकारी के लिए एपीआई:

$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/apidoc/1.11/

+2

एपीसी को छोड़कर ... – regilero

+0

आपके समय ड्यूक के लिए धन्यवाद। जैसा कि regilero नीचे बताया गया एपीसी टैग का समर्थन नहीं करता है। टैग का समर्थन करने के लिए आप इस मामले में किस बैकएंड का उपयोग करेंगे? –

+0

हम कितने कैश प्रविष्टियों के बारे में बात कर रहे हैं? यदि इसकी 10 या 20 मैं बस प्रत्येक प्रविष्टि को हटा दूंगा। आपकी ज़रूरतों के आधार पर आप अलग-अलग प्रविष्टियों के बजाय कैश में एक धारावाहिक सहयोगी सरणी को सहेजने पर विचार कर सकते हैं। यह एक अच्छा विचार नहीं है यदि आपको अलग-अलग प्रविष्टियों को अद्यतन/हटाना पड़ता है, हालांकि – theduke

4

@theduke सही है, टैगिंग, एपीसी के अलावा यह करने के लिए सही तरीका है, के रूप में Zend_Cache_Backend_Apc टैगिंग का समर्थन नहीं करता है। the doc से:

सावधान रहें: यह बैकएंड साथ, "टैग" पल

लिए समर्थित नहीं हैं और अपने पिछले टिप्पणी से यह आप एक बैकेंड के रूप में एपीसी का उपयोग कर रहे sems। तो या तो आप इस वर्ग को बढ़ाते हैं और टैग व्यवहार जोड़ते हैं (टैग पहचानकर्ता में एक विशेष वाक्यविन्यास जोड़कर? टैग बनाम कैश एंट्री मैपिंग को कहीं और ?, लंबी अवधि के कैश एंट्री में?), या आप किसी अन्य कैश का उपयोग करने का निर्णय लेते हैं बैकएंड।

+0

कौन सा बैकएंड टैग का समर्थन करता है? ऐसा लगता है कि अधिकांश बैकएंड ज़ेंड मैनुअल –

+0

से http://framework.zend.com/manual/en/zend.cache.backends.html से नहीं हैं, आप देख सकते हैं कि टैग फ़ाइल बैकएंड, SQLite बैकएंड और आंशिक रूप से ZendPlatform पर। – regilero

संबंधित मुद्दे