Concurrency 当我同时运行zadd时,如何限制排序集的最大长度?

Concurrency 当我同时运行zadd时,如何限制排序集的最大长度?,concurrency,redis,Concurrency,Redis,我想使用redis来存储这样的数据:{id:timestamp(1416991171)}在一个排序集中,它需要有一个最大长度 我只是在插入新的成员/值对之前检查排序集的长度。但我不确定这是否是确保最大长度的好主意,因为我将同时运行它 代码如下(在ruby中): key=“list” 最大值=5 如果$redis.zcard(键)

我想使用redis来存储这样的数据:
{id:timestamp(1416991171)}
在一个排序集中,它需要有一个最大长度

我只是在插入新的成员/值对之前检查排序集的长度。但我不确定这是否是确保最大长度的好主意,因为我将同时运行它

代码如下(在ruby中):

key=“list”
最大值=5
如果$redis.zcard(键)
如何确保最大长度?提前感谢。

注意:您使用
键两次,一次用于排序集,另一次用作标识符,因此您的问题似乎有输入错误。在我的回复中,我将标识符称为
keyx

有两个选项可以确保排序集不会超过
max
,即使用Redis'或。这两种方法都将确保工作流的原子性(尽管我个人更喜欢后者)

使用事务性方法,您可能会执行以下伪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”
最大值=5
$redis.watch钥匙
如果$redis.zcard(键)
或者,使用脚本:

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"
key=“list”
最大值=5
=
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"