Redis中的固定大小的有序集合是什么?

5
我是一个在使用Redis方面的新手,在思考如何处理我们系统中高并发情况时遇到了问题。我想使用Redis,因为所有人都知道从内存中访问比IO快得多。有序集合(Sorted Set)是我们可能用来解决这个问题的工具,我们希望有一个固定大小的有序集合来包含用户的手机号码。我通过谷歌/Baidu搜索了很多,但没有找到任何有意义的信息,所以有谁能告诉我如何指定Redis有序集合的固定大小呢?并且设置应该告诉我添加操作是否成功?谢谢。
2个回答

7

我认为你无法指定大小,你需要自己检查。

你可以使用ZCARD

ZCARD KEY

或者您可以直接移除第一个元素 ZREMRANGEBYRANK

[ZREMRANGEBYRANK][2] [KEY] 0 -[YOURSIZE]

1
SCARD 用于常规(未排序)集合。请使用 ZCARD - Itamar Haber
感谢您的回答。 - Brady Zhu
我认为你想要使用“ZREMRANGEBYRANK [KEY] 0 -[YOURSIZE + 1]”来保留最高的[YOURSIZE]个值。 - Jeff Moser
如果排序集合没有超过“YOURSIZE”或预期限制,时间复杂度会是多少?它是否是一个常数时间操作? - animageofmine

0

可以通过使用 Lua 脚本来检查集合大小(ZCARD)并在添加元素(ZADD)之前完成此操作。复杂度为 O(log(|setsize|))

-- KEYS[1] the sorted set
-- ARGV[1] the score 
-- ARGV[2] the member 
-- ARGV[3] the max size of the sorted set 
-- Returns number of elements added
--
if redis.call('ZCARD', KEYS[1]) < tonumber(ARGV[3]) then
    return redis.call('ZADD', KEYS[1], ARGV[1], ARGV[2])
else
    return 0    
end

如果你把上面的片段保存为test.lua文件然后运行它几次,就可以试一下。

redis-cli --eval test.lua myset , 1 A 3
redis-cli --eval test.lua myset , 2 B 3
redis-cli --eval test.lua myset , 3 C 3
redis-cli --eval test.lua myset , 4 D 3
redis-cli --eval test.lua myset , 5 E 3

验证

127.0.0.1:6379> ZRANGE myset 0 100
1) "A"
2) "B"
3) "C"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接