gpt4 book ai didi

concurrency - 当我并发运行 zadd 时,如何限制排序集的最大长度?

转载 作者:可可西里 更新时间:2023-11-01 11:13:35 27 4
gpt4 key购买 nike

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

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

代码是这样的(在 ruby​​ 中):

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

如何保证最大长度?提前致谢。

最佳答案

注意:您的问题似乎有错字,因为您使用了 key 两次 - 一次用于排序集,一次用作标识符。我在回复中将标识符称为 keyx

您有两种选择来确保您的 Sorted Set 不会增长到 max 以上,即使用 Redis 的 transactionsserver-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"

关于concurrency - 当我并发运行 zadd 时,如何限制排序集的最大长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27144836/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com