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_',
}
गुइडो इसका उत्तर देता है: http://neopythonic.blogspot.com/2011/08/compare-and-set-in-memcache.html। जब कोई मूल्य सेट नहीं होता है तो incr वृद्धि नहीं होती है। अब जब आप एक मूल्य निर्धारित करने का प्रयास करते हैं तो दौड़ की स्थिति होती है। सीएएस उस दौड़ की स्थिति को हल करने का प्रयास करता है। –
बाइनरी प्रोटोकॉल 'incr' आपको प्रारंभ मान निर्दिष्ट करने की अनुमति देता है। इससे पहले, आप बस एक जोड़ तो incr करेंगे। – Dustin
@Dustin incr नहीं करता है कि अजगर मेम्कैश में कार्यान्वयन 'incr (स्वयं, कुंजी, डेल्टा = 1) memcache.Client उदाहरण की विधि सर्वर के लिए एक आदेश भेजता atomically द्वारा सी {कुंजी} के लिए मूल्य बढ़ाने के लिए सी {डेल्टा}, या 1 से अगर सी {डेल्टा} निर्दिष्ट नहीं है। कोई नहीं लौटाता है यदि सी {कुंजी} सर्वर पर मौजूद नहीं है, अन्यथा यह बढ़ने के बाद नया मान देता है। ध्यान दें कि सी {कुंजी} के लिए मान पहले से ही memcache, में मौजूद होना चाहिए और यह एक पूर्णांक का स्ट्रिंग प्रतिनिधित्व होना चाहिए। –