Django原子增加初始值
我正在尝试在 Django 缓存中进行原子增加或创建操作。我使用 memcache 作为后端。 Memcache 客户端的 incr_async()
函数采用 initial_value
参数。其含义是:
如果缓存中尚不存在该键并且您指定了一个 初始值,键的值将被设置为此初始值并且 然后递增。
但是,我不知道如何在 Django 中执行此操作,如 cache.incr()
文档所述:
如果您尝试递增或递减 a,则会引发 ValueError 不存在的缓存键。
我当然可以这样做:
cache.add(key,initial_value)
cache.incr(key)
但这不是原子的,可能会导致竞争条件。
有没有办法解决这个问题,从而保持操作的原子性?
I'm trying to have atomic increase-or-create operation in Django cache. I'm using memcache as backend. Memcache client's incr_async()
function takes initial_value
parameter. The meaning is:
If the key does not yet exist in the cache and you specify an
initial_value, the key's value will be set to this initial value and
then incremented.
However, I don't see how can I do this in Django, as cache.incr()
documentation says:
A ValueError will be raised if you attempt to increment or decrement a
nonexistent cache key.
Of course I could do:
cache.add(key,initial_value)
cache.incr(key)
But that is not atomic and may lead to race conditions.
Is there a way around this, which would preserve atomicity of the operation?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
据我所知 Django 的缓存 API 不支持这个。您必须下拉到 memcache API 并直接执行此操作:
As far as I know Django's cache API don't support this. You would have to drop down to the memcache API and do this directly:
Django
cache.add
方法本身是原子的。这意味着如果密钥已经存在,它将不会执行任何操作。因此您可以使用而不必担心竞争情况。
注:Django版本3.0.8
Django
cache.add
method itself is atomic. Meaning if the key already exists, it won't do anything. So you can usewithout worrying about the race around condition.
Note: Django version 3.0.8