简体   繁体   English

从Redis中的排序集中获取随机项目

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM