2011-11-01 18 views
7

Related to this question.Django Memcache कोड समीक्षा: तुलना करें और सेट

मैं Memcache’s compare and set का उपयोग कर memcached में एक काउंटर वेतन वृद्धि लागू करने के लिए कोशिश कर रहा हूँ।

कोई संभावित loopholes के लिए इस कोड की समीक्षा कर सकता है?

def increment(id): 
    client = get_cache('memcache') 
    i = 0 
    items = 0 
    while i <= 3: 
     counter = client._cache.gets(id) 
     if counter is not None: 
      items = client._cache.cas(id, counter+1) 
      if items: 
       break 
     else: 
      items = client._cache.add(id, 0) 
      if items: 
       break 
     i+= 1 
    return items 

इसके अतिरिक्त के बाद से मैं Django के माध्यम से एक आंतरिक memcached एपीआई का उपयोग कर रहा उपलब्ध नहीं, तो इस कुंजी का प्रारंभिक भाग मैं सेटिंग में के माध्यम से सेट संलग्न है। यदि नहीं, तो मैं इस आंतरिक एपीआई कॉल के लिए कुंजी कैसे जोड़ सकता हूं?

'memcache': { 
    'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 
    'LOCATION': '127.0.0.1:11211', 
    'KEY_PREFIX': 'store_', 
} 

उत्तर

4

मैं वास्तव में आपके सवाल का सीधे जवाब दे रहा हूँ, लेकिन मैं क्यों तुम सिर्फ atomically एक मूल्य बढ़ाने के लिए incr() विधि का उपयोग नहीं कर रहे हैं पूछ मदद नहीं कर सकता - कि क्या इसके लिए है। हो सकता है कि आपने अभी एक उदाहरण पोस्ट किया हो, लेकिन यदि ऐसा है, तो यह एक भ्रामक सवाल है।

+0

गुइडो इसका उत्तर देता है: http://neopythonic.blogspot.com/2011/08/compare-and-set-in-memcache.html। जब कोई मूल्य सेट नहीं होता है तो incr वृद्धि नहीं होती है। अब जब आप एक मूल्य निर्धारित करने का प्रयास करते हैं तो दौड़ की स्थिति होती है। सीएएस उस दौड़ की स्थिति को हल करने का प्रयास करता है। –

+0

बाइनरी प्रोटोकॉल 'incr' आपको प्रारंभ मान निर्दिष्ट करने की अनुमति देता है। इससे पहले, आप बस एक जोड़ तो incr करेंगे। – Dustin

+0

@Dustin incr नहीं करता है कि अजगर मेम्कैश में कार्यान्वयन 'incr (स्वयं, कुंजी, डेल्टा = 1) memcache.Client उदाहरण की विधि सर्वर के लिए एक आदेश भेजता atomically द्वारा सी {कुंजी} के लिए मूल्य बढ़ाने के लिए सी {डेल्टा}, या 1 से अगर सी {डेल्टा} निर्दिष्ट नहीं है। कोई नहीं लौटाता है यदि सी {कुंजी} सर्वर पर मौजूद नहीं है, अन्यथा यह बढ़ने के बाद नया मान देता है। ध्यान दें कि सी {कुंजी} के लिए मान पहले से ही memcache, में मौजूद होना चाहिए और यह एक पूर्णांक का स्ट्रिंग प्रतिनिधित्व होना चाहिए। –

2

ऊपर दी गई कुछ अन्य टिप्पणियों के अलावा, मैंने पाया कि डिफ़ॉल्ट कैस समर्थन द्वारा पायथन-मेमकैड क्लाइंट में अक्षम किया गया है।

client._cache.cache_cas = सच

क्रम में cas प्राप्त करने के लिए() वास्तव में cas आदेश का उपयोग करें: चूंकि Django निर्माता के लिए विशेषताएं जोड़ना का एक तरीका का समर्थन नहीं करता, मैं जोड़ने के लिए किया था। साथ ही, कृपया स्रोत में reset_cas के बारे में पढ़ें: http://bazaar.launchpad.net/~python-memcached-team/python-memcached/trunk/view/head:/memcache.py

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