Django原子增加初始值

发布于 2024-12-16 16:14:57 字数 513 浏览 1 评论 0原文

我正在尝试在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

雨后彩虹 2024-12-23 16:14:57

据我所知 Django 的缓存 API 不支持这个。您必须下拉到 memcache API 并直接执行此操作:

from django.core.cache import cache

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

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:

from django.core.cache import cache

client = cache._client  # <--direct reference to memcached.Client object
执妄 2024-12-23 16:14:57

Django cache.add 方法本身是原子的。这意味着如果密钥已经存在,它将不会执行任何操作。因此您可以使用

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

而不必担心竞争情况。

注: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 use

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

without worrying about the race around condition.

Note: Django version 3.0.8

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文