2010-04-08 13 views
6

मैं एक सिस्टम में डेटाबेस से कनेक्ट करने के लिए पीडीओ का उपयोग कर रहा हूं जहां मैं memcached लागू करना चाहता हूं।मैं पीडीओ और memcached का उपयोग कर कैश सिस्टम कैसे डिजाइन कर सकते हैं?

मुझे नहीं पता कि परिणाम कैश करने के लिए कौन सी चाबियाँ उपयोग करती हैं क्योंकि मुझे पीडीओ (क्योंकि तैयार कथन) के साथ अंतिम क्वेरी की स्ट्रिंग नहीं मिल सकती है।

इसे हल करने के लिए कोई अच्छा विचार है?

अग्रिम धन्यवाद।

+0

क्या आपको कोई मदद मिलती है जो आपको मदद करती है? –

उत्तर

7

तुम सिर्फ सीधे क्वेरी परिणाम कैश करने के लिए जा रहे हैं क्वेरी स्ट्रिंग के आधार पर, MySQL की क्वेरी कैश पहले से ही आपके लिए यह करती है। पहिया को पुन: पेश न करें। एक संभावित अंतर है MySQL का क्वेरी कैश आक्रामक रूप से अमान्य है ताकि पुराना (पुराना, गलत) डेटा कभी वापस नहीं किया जा सके; आप अमान्यता को कैसे संभालेंगे, इस पर निर्भर करते हुए, आपकी रणनीति डेटाबेस लोड को और कम कर सकती है, लेकिन नियमित आधार पर पुराने डेटा की पुरानी सेवा की लागत पर।

इसके अतिरिक्त, अपडेट होने पर आप वास्तव में अपने विभिन्न कैश कुंजी का चयन करने में सक्षम नहीं होंगे (आप कैसे जानेंगे कि एक सम्मिलित/अद्यतन चलने पर कौन सी क्वेरी स्ट्रिंग की अवधि समाप्त होनी चाहिए?); नतीजतन आपको केवल एक संक्षिप्त समाप्ति समय (शायद सेकंड में) सेट करना होगा, ताकि आप उस समय की मात्रा को कम कर सकें जब आप पुराने डेटा की सेवा कर रहे हों। इसका मतलब शायद कम कैश हिट दर होगा। अंत में, आपके द्वारा वर्णित कैशिंग रणनीति लागू करने के लिए सरल है, लेकिन यह बहुत प्रभावी नहीं है।

memecached FAQ के "Generic Design Approaches" section को पढ़ना सुनिश्चित करें। अपडेट होने पर एक अच्छी कैशिंग रणनीति तुरंत कैश किए गए डेटा को हटा देती है/प्रतिस्थापित करती है - इससे आपको घंटे/दिन/सप्ताह के लिए डेटा कैश करने की अनुमति मिलती है, और साथ ही उपयोगकर्ताओं को डेट डेटा से पहले कभी भी सेवा नहीं मिलती है।

+1

आप ठीक कह रहे हैं। मेरा प्रश्न कोई समझ नहीं आता है। धन्यवाद! – Castro

1

यहाँ दिलचस्प ट्यूटोरियल है यह सहायक हो सकती - http://techportal.inviqa.com/2009/02/16/getting-started-with-memcached/

मुझे लगता है कि आप इस तरह से एक समारोह को लागू करने से प्रक्रिया को स्वचालित कर सकते हैं:

function query($name, $sql, $params, $db, $cache) { 
    $result = $this->cache->get($name); 

    if (!$result) { 
     $stmt = $db->prepare($sql); 
     $exec = $stmt->execute($params); 
     $result = $stmt->fetch(PDO::FETCH_ASSOC); 

     $cache->add($name, $result); 
    } 

    return $result; 
} 
+0

हाँ, मैं अधिक पारदर्शी (मैं हर क्वेरी नामकरण करना चाहते हैं न), मुझे लगता है कि मैं क्वेरी पैरामीटर के बाकी के साथ concatenated हैश करने के लिए जा रहा हूँ कुछ में सोच रहा था। आपको क्या लगता है? – Castro

+5

$ एसक्यूएल + पैरामीटर से एक कैश कुंजी का निर्माण काफी सरल है - बस इवो के समारोह के शीर्ष करने के लिए इस लाइन जोड़ने के लिए, और $ नाम तर्क निकालें: '$ name = 'querycache-'। md5 (क्रमानुसार (सरणी ($ एसक्यूएल, $ पैरामीटर))); ' –

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