Django 原子性增加初始值
我想在Django的缓存中实现一个原子性的增加或创建操作。我使用的是memcache作为后端。memcache客户端的incr_async()
函数有一个initial_value
参数。这个参数的意思是:
如果缓存中还没有这个键,并且你指定了一个初始值,那么这个键的值会被设置为这个初始值,然后再进行增加。
但是,我在Django中不知道怎么做,因为cache.incr()
的文档上说:
如果你尝试增加或减少一个不存在的缓存键,会引发一个ValueError错误。
当然,我可以这样做:
cache.add(key,initial_value)
cache.incr(key)
但这样做不是原子的,可能会导致竞争条件。
有没有办法解决这个问题,同时保持操作的原子性呢?
2 个回答
0
Django的cache.add
方法是原子的。这意味着如果你要添加的键已经存在,它就不会做任何事情。所以你可以使用
cache.add(key,initial_value)
cache.incr(key)
而不用担心竞争条件的问题。
注意:这是Django 3.0.8版本的内容。
4
据我所知,Django的缓存接口不支持这个功能。你需要直接使用memcache的接口来实现这个操作:
from django.core.cache import cache
client = cache._client # <--direct reference to memcached.Client object