2014-11-26 3 views
0

Я хочу использовать redis для хранения таких данных: {id: timestamp(1416991171)} в сортированном наборе, и он должен иметь максимальную длину.Как ограничить максимальную длину сортированного набора при запуске zadd одновременно?

Я просто проверяю длину отсортированного набора, прежде чем вставлять новую пару элементов/значений. Но я не уверен, что это хорошая идея, чтобы обеспечить максимальную длину, потому что я буду запускать ее одновременно.

код, как это (рубин): ​​

key = "list" 
max = 5 
if $redis.zcard(key) < max 
    $redis.zadd(key, Time.now.to_i, "foo") 
end 

Как я могу гарантировать, что максимальную длину? Заранее спасибо.

ответ

2

Примечание: похоже, ваш вопрос имеет опечатку, поскольку вы используете key дважды - один раз для отсортированного набора и один раз в качестве вашего идентификатора. Я упомянул идентификатор как keyx в своем ответе.

У вас есть два варианта, чтобы убедиться, что ваш отсортированный набор не растет выше max, а именно использовать Redis' transactions или server-side Lua scripts. Оба подхода обеспечат атомарность рабочего процесса (хотя лично я предпочитаю последний).

Использование транзакционный подход, вы, вероятно, сделать что-то вроде следующего кода псевдо-Ruby:

key = "list" 
max = 5 
$redis.watch key 
if $redis.zcard(key) < max 
    $redis.multi 
    $redis.zadd(key, Time.now.to_i, "foo") 
    $redis.exec 
else 
    $redis.unwatch key 
end 

В качестве альтернативы, с помощью сценария:

key = "list" 
max = 5 
s = <<EOF 
if redis.call('ZCARD', KEYS[1]) < ARGV[1] then 
    redis.call('ZADD', KEYS[1], ARGV[2], ARGV[3]) 
end 
EOF 
$redis.eval s, 1, key, max, Time.now.to_i, "foo" 
+0

К сожалению, это опечатка, действительно. Я обновил это –

+0

Эта помощь. Спасибо! –

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