2011-11-18 25 views
5

Estoy intentando tener una operación de aumento o creación atómica en la memoria caché de Django. Estoy usando Memcache como back-end. La función incr_async() del cliente Memcache toma el parámetro initial_value. El significado es:Aumento atómico de Django con valor inicial

Si la clave no existe todavía en la memoria caché y se especifica un initial_value , el valor de la clave se establecerá en este valor inicial y luego se incrementa .

Sin embargo, no veo cómo puedo hacer esto en Django, como cache.incr() documentación dice:

Un ValueError será elevado si se intenta incrementar o reducir de una clave de caché inexistente .

Por supuesto que podía hacer:

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

Pero eso no es atómico y puede conducir a condiciones de carrera.

¿Hay alguna forma de evitar esto, lo que preservaría la atomicidad de la operación?

+1

Ver esta pregunta muy similar: http://stackoverflow.com/questions/7967477/django-memcache-code-review-compare-and -conjunto. Una respuesta sugiere que la implementación python de Memcache en realidad no admite 'incr' con un repliegue inicial. Debes 'agregar' y luego' incr' en dos operaciones separadas según ese usuario. Es posible que desee comprobar la validez de eso. –

Respuesta

2

Por lo que sé, la API de caché de Django no es compatible con esto. Usted tendría que bajar a la API de Memcache y hacerlo directamente:

from django.core.cache import cache 

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

¿hay alguna manera fácil de obtener Memcache de la instancia 'cache' de Django? – vartec

+0

Estoy bastante seguro. Voy a comprobar cómo una vez que llego al trabajo en una hora más o menos –

+0

Creo que es simplemente 'memcache = get_cache ('memcache')' y luego 'memcache._cache.whatever()' ('de django.core.cache import get_cache') –

Cuestiones relacionadas