2011-11-18 17 views
5

Sto provando ad avere un'operazione di incremento o creazione atomica nella cache di Django. Sto usando memcache come backend. La funzione incr_async() del client Memcache richiede il parametro initial_value. Il significato è:Aumento atomico di Django con valore iniziale

Se la chiave non esiste ancora nella cache e si specifica un valore_iniziale, il valore della chiave verrà impostato su questo valore iniziale e poi incrementato.

Tuttavia, non vedo come posso fare questo in Django, come cache.incr() documentazione dice:

Un ValueError verrà generato se si tenta di incrementare o decrementare una chiave di cache inesistente .

Naturalmente ho potuto fare:

cache.add(key,initial_value) 
cache.incr(key) 

Ma non è atomico e può portare a condizioni di gara.

C'è un modo per aggirare questo, che preserverebbe l'atomicità dell'operazione?

+1

Vai a questa domanda molto simile: http://stackoverflow.com/questions/7967477/django-memcache-code-review-compare-and -impostato. Una risposta suggerisce che l'implementazione python di memcache non supporta effettivamente 'incr' con un fallback iniziale. Devi 'aggiungere' e poi' incr' in due operazioni separate secondo quell'utente. Potresti voler verificare la validità di ciò. –

risposta

2

Per quanto ne so, l'API cache di Django non supporta questo. Si dovrebbe cadere giù alle API memcache e farlo direttamente:

from django.core.cache import cache 

client = cache._client # <--direct reference to memcached.Client object 
+0

c'è un modo semplice per ottenere memcache dall'istanza 'cache' di Django? – vartec

+0

Sono abbastanza sicuro. Verificherò come una volta che mi metterò al lavoro tra un'ora o più –

+0

Penso che sia solo 'memcache = get_cache ('memcache')' e quindi 'memcache._cache.whatever()' ('from django.core.cache import get_cache') –