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

我需要实现一组带有单独过期时间的项目,因此我使用了具有过期时间戳分数的 zset。 现在,我想从未过期项目的范围内获取随机项,或者至少从设定的所有项目中获取随机项。 我该如何做呢?

我可以通过 LUA 脚本获取范围的最小和最大排名以及其中的随机排名吗?

Redis 版本:5.0.2

点赞
用户1009099
用户1009099

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

-- KEYS[1] - 集合键
-- ARGV[1] - 随机种子时间戳

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 秒我会从过期项中进行清理。

2019-05-20 16:43:07
用户13226483
用户13226483

ARGV[1] 替换为 os.time()

2020-04-05 07:18:04