Related to this question.Django Codice Memcache recensione: Confronto e impostare
Sto cercando di implementare un incremento di contatore in memcached utilizzando Memcache’s compare and set.
Qualcuno può rivedere questo codice per potenziali scappatoie?
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
Inoltre dal momento che sto usando un'API memcached interno non disponibile attraverso Django, fa questo accoda il prefisso chiave ho impostato attraverso le impostazioni. In caso contrario, come posso aggiungere la chiave per questa chiamata API interna?
'memcache': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
'KEY_PREFIX': 'store_',
}
Guido risponde a questo: http://neopythonic.blogspot.com/2011/08/compare-and-set-in-memcache.html. incr non incrementa quando non è impostato alcun valore. Ora, quando provi a impostare un valore, c'è una condizione di competizione. CAS tenta di risolvere quella condizione di gara. –
Il protocollo binario 'incr' consente di specificare un valore iniziale. Prima di ciò, dovresti solo aggiungere un add, quindi incr. – Dustin
@Dustin Incr non lo fa nell'implementazione di Python Memcache 'incr (auto, chiave, delta = 1) metodo di memcache. Istanza client Invia un comando al server per incrementare atomicamente il valore per C {chiave} di C {delta}, o di 1 se C {delta} non è specificato. Restituisce Nessuno se C {chiave} non esiste sul server, altrimenti esso restituisce il nuovo valore dopo l'incremento. Si noti che il valore per C {chiave} deve già esistere nel memcache, e deve essere la rappresentazione in stringa di un numero intero. –