Джанго атомное увеличение с начальным значением - PullRequest
5 голосов
/ 18 ноября 2011

Я пытаюсь выполнить атомарную операцию увеличения или создания в кеше Django.Я использую memcache в качестве бэкэнда.Функция incr_async() клиента Memcache принимает параметр initial_value.Значение:

Если ключ еще не существует в кеше, и вы указали initial_value, значение ключа будет установлено на это начальное значение, а затем увеличено.

Однако я не вижу, как я могу сделать это в Django, поскольку документация cache.incr() гласит:

Значение ValueError будет вызвано, если вы попытаетесь увеличить или уменьшить несуществующий ключ кэша.

Конечно, я мог бы сделать:

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

Но это не атомно и может привести к условиям гонки.

Есть ли способ обойти это, чтобы сохранить атомарность операции?

1 Ответ

2 голосов
/ 18 ноября 2011

Насколько я знаю, API кеширования Django не поддерживает это. Вам нужно было бы перейти к API memcache и сделать это напрямую:

from django.core.cache import cache

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