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

Get random item from sorted set in Redis

我需要实现一组具有单独过期时间的项目,所以我使用了 zset 以及过期时间戳的分数。 现在我想从未过期的项目范围内或至少从集合中的所有项目中获取随机项目。 我该怎么做?

我可以通过 LUA 脚本获取范围的最小和最大等级以及它们之间的随机等级吗?

Redis version: 5.0.2

我通过以下脚本解决了这个问题:

-- 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

并且因为我在所有项目中搜索,所以我每 n 秒对过期项目进行一次消毒。

可以改变:

ARGV[1] -> os.time()