Атомарно удалить элемент из набора, если счетчик в другом ключе ниже нуля?

Redis 2.0.3

В моей Redis DB у меня есть набор элементов. С каждым элементом связан счетчик:

MULTI
    SADD "items-set" "foo"
    INCRBY "items:foo" 10000
EXEC

Новые элементы добавляются в набор через случайные интервалы.

Когда пользователь выполняет определенное действие, счетчик уменьшается:

new_counter = DECR "items:foo"

Мне нужно атомарно удалить элемент из установить, когда счетчик упадет ниже нуля (альтернативно: когда счетчик точно достигнет нуля, я могу исправить логику для этого.)

if new_counter < 0 then
    MULTI
        SREM "items-set" "foo"
        DEL "items:foo"
    EXEC
end

Как я могу сделать это без блокировки по имени элемента с помощью SETNX / GETSET ?

Решения, предполагающие изменение способа хранения данных в Redis, являются приемлемыми. (Но, на всякий случай, я оставляю за собой право противопоставить им некоторые детали конкретной задачи, которые я мог пропустить в исходном тексте. )

6
задан Alexander Gladysh 27 October 2012 в 12:54
поделиться