2014-01-27 2 views
0

В MySQL:Как обновить zset счет с «где положение» в Redis

update zset.1 set score = score + 10 where value = 1 and score > 100 

Это означает, что он не будет обновляться, за исключением баллов составляет 100 GT

В Redis и программный код:

score = zscore zset.1 1 
if (score > 100) { 
    score = zincrby zset.1 10 1 
} 

Это должно работать, но оно не является атомарным. Оценка будет обновляться несколько раз при обновлении одновременно

Кроме того, «WATCH» не подходит для моей ситуации, так как механизм RETRY будет проблемой производительности.

ответ

1

Есть два способа сделать это:

  • Использование Redis multi()/exec() комбинационные выполнить ряд Redis вызовов атомарно. See Redis Transactions.
  • Напишите сценарий Lua. См. documentation for eval function in Redis для получения дополнительной информации.
Смежные вопросы