2014-11-20 6 views
0

Я создал ключ в redis следующим образом.Должен ли я увеличивать несколько полей ключа в одной команде?

hmset mykey field1 1 field2 2 
OK 

//checked with command 
hgetall mykey 
1) "field1" 
2) "1" 
3) "field2" 
4) "2" 

результат в порядке, а работа прекрасна. Теперь я хочу увеличить оба значения в одной команде, например

hincrby mykey field1 1 field2 1 

Возможно ли это?

ответ

1

No - HINCRBY не поддерживает этот тип использования. Если ваша мотивация заключается в обеспечении атомарности двух приращений, используйте MULTI/EXEC или серверный сценарий Lua (см. Команду EVAL).

Вот как решить оригинальный вопрос, чтобы обеспечить атомарность:

MULTI 
HSET mykey field1 1 
HSET mykey field2 2 
EXEC 

Для 2-й вопрос (в комментариях - «только если больше, то»), следующий скрипт должен быть EVALed с этими параметрами 1 <keyname> <value>:

local curr = tonumber(redis.call("GET", KEYS[1])) 
if type(curr) == "number" and curr < tonumber(ARGV[1]) then 
    redis.call("SET", KEYS[1], ARGV[1]) 
    return "OK" 
end 
+0

делает любой вариант в redis, чтобы установить только большее значение в ключе по сравнению с существующим значением. например, если мой ключ имеет некоторое значение, например «10», и я устанавливаю новое значение «9», то он не должен хранить/устанавливать, но если я передаю «11», заменим старое значение новым значением. Есть ли у вас какие-либо идеи? –

+1

К сожалению, ответа по-прежнему нет. Для этого вам нужно будет использовать тот же подход, что и выше (MULTI/EXEC или Lua). LMK, если вам нужна дополнительная информация о том, как его реализовать. –

+0

Да, @ itamar-haber, мне любопытно посмотреть, как эффективно мы можем это сделать. большое спасибо. –

Смежные вопросы