从 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()
我需要实现一组具有单独过期时间的项目,所以我使用了 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()