2011-11-01 9 views
7

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_', 
} 

risposta

4

io non sono davvero rispondere alla tua domanda direttamente, ma non posso fare a chiedere perché non sono solo utilizzando il metodo incr() per atomicamente incrementare un valore - che è quello che è per. Forse hai appena pubblicato un esempio, ma se è così, allora è una specie di domanda fuorviante.

+0

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. –

+0

Il protocollo binario 'incr' consente di specificare un valore iniziale. Prima di ciò, dovresti solo aggiungere un add, quindi incr. – Dustin

+0

@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. –

2

Oltre ad alcuni degli altri commenti sopra, ho scoperto che, per impostazione predefinita, il supporto cas è disabilitato nel client python-memcached. Dal momento che Django non supporta un modo di aggiungere attributi al costruttore, ho dovuto aggiungere:

client._cache.cache_cas = True

al fine di ottenere cas() utilizzare effettivamente il comando cas. Inoltre, leggi il reset_cas nella sorgente: http://bazaar.launchpad.net/~python-memcached-team/python-memcached/trunk/view/head:/memcache.py