2011-11-18 60 views
5

我试图在Django缓存中进行原子增加或创建操作。我使用memcache作为后端。 Memcache客户端的incr_async()功能需要initial_value参数。意思是:Django原子增加初始值

如果键不在缓存中,而您指定的 initial_value,该键的值将被设置为这个初始值,然后 递增。

不过,我不知道怎样才能做到这一点在Django,为cache.incr()文档说:如果你试图递增或递减一个 不存在的缓存键

一个ValueError将提高。

我当然可以这样做:

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

但是,这不是原子弹,可能导致竞争条件。

有没有办法解决这个问题,这会保持操作的原子性?

+1

看到这个非常类似的问题:http://stackoverflow.com/questions/7967477/django-memcache-code-review-compare-and -组。一个答案表明,memcache的python实现实际上并不支持具有初始回退的“incr”。根据该用户,您必须在两个单独的操作中添加,然后添加incr。你可能想检查一下它的有效性。 –

回答

2

据我所知Django的缓存API不支持这一点。你将不得不下降到内存缓存API,直接做到这一点:

from django.core.cache import cache 

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

有没有简单的方法从Django的'cache'实例获取memcache? – vartec

+0

我很确定。我会检查一次我在一个小时内如何工作 –

+0

我认为这只是'memcache = get_cache('memcache')'然后'memcache._cache.whatever()'('from django.core.cache导入get_cache') –