我是一个在使用Redis方面的新手,在思考如何处理我们系统中高并发情况时遇到了问题。我想使用Redis,因为所有人都知道从内存中访问比IO快得多。有序集合(Sorted Set)是我们可能用来解决这个问题的工具,我们希望有一个固定大小的有序集合来包含用户的手机号码。我通过谷歌/Baidu搜索了很多,但没有找到任何有意义的信息,所以有谁能告诉我如何指定Redis有序集合的固定大小呢?并且设置应该告诉我添加操作是否成功?谢谢。
我认为你无法指定大小,你需要自己检查。
你可以使用ZCARD
ZCARD KEY
或者您可以直接移除第一个元素 ZREMRANGEBYRANK
[ZREMRANGEBYRANK][2] [KEY] 0 -[YOURSIZE]
可以通过使用 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"
SCARD
用于常规(未排序)集合。请使用ZCARD
。 - Itamar Haber