Атомный GETSET на хеш в Redis - PullRequest
       14

Атомный GETSET на хеш в Redis

8 голосов
/ 09 октября 2011

Я собираюсь хранить счетчик посещений для нескольких URL в Redis. Я планирую использовать хэш , потому что это имеет смысл. Он также имеет функцию атомарного приращения, которая имеет решающее значение для моего варианта использования.

Время от времени я собираюсь объединять количество посещений по URL в другое хранилище данных. Для этого я хотел бы получить счетчик обращений и сбросить его на ноль. Кажется, я не могу найти операцию типа GETSET , которая работает с хэшами. Если я запишу попадание между счетчиком обращений и сбросом его на ноль, оно потеряется без какой-либо атомарной операции.

Я что-то упустил? Одна из альтернатив, которая пришла мне в голову, - это хэшировать URL в моем клиентском (python) коде и использовать строковые команды , но это выглядит как хак, когда Redis предоставляет сам хэш.

1 Ответ

6 голосов
/ 09 октября 2011

Попробуйте посмотреть на redis транзакции документы, а именно сочетание WATCH и MULTI команд:

WATCHed ключиотслеживается с целью выявления изменений против них.Если хотя бы один отслеживаемый ключ был изменен до выполнения команды EXEC, вся транзакция прерывается, и EXEC возвращает пустой ответ NULL, чтобы уведомить о сбое транзакции.

...

Так что же такое WATCH?Это команда, которая сделает EXEC условной: мы просим Redis выполнить транзакцию, только если ни один другой клиент не изменил какой-либо из ключей WATCHed.В противном случае транзакция не будет введена вообще.

...