Django 原子性增加初始值

6 投票
2 回答
2728 浏览
提问于 2025-04-17 06:36

我想在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

撰写回答