[英]Get random item from sorted set in Redis
I was needed to implement set of items with individual expiration, so I used zset
with score of expiration timestamp.我需要实现一组具有单独过期时间的项目,所以我使用了带有过期时间戳分数的zset
。 Now I want to get random item from range of not expired items, or at least from all items in set.现在我想从未过期的项目范围中获取随机项目,或者至少从集合中的所有项目中获取。 How can I do it?我该怎么做?
Can I get min and max rank of range and random rank in between of it via LUA scripting?我可以通过 LUA 脚本获得范围的最小和最大等级以及它们之间的随机等级吗?
Redis version: 5.0.2
I solve this via following script:我通过以下脚本解决了这个问题:
-- KEYS[1] - set key
-- ARGV[1] - seed timestamp
local count = redis.call('ZCARD', KEYS[1])
if count ~= 0 then
math.randomseed(ARGV[1])
local rank = math.random(0, count - 1)
local range = redis.call('ZRANGE', KEYS[1], rank, rank)
return range[1]
else
return ''
end
And because I search among all items I do sanitization from expired items every n
seconds.而且因为我在所有项目中搜索,所以我每n
秒对过期项目进行消毒。
可以换:
ARGV[1] -> os.time()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.