Получить случайный предмет из отсортированного набора в Redis - PullRequest
0 голосов
/ 20 мая 2019

Мне потребовалось реализовать набор предметов с индивидуальным сроком действия, поэтому я использовал zset с отметкой времени истечения срока действия. Теперь я хочу получить случайный предмет из диапазона не просроченных предметов или хотя бы из всех предметов в наборе. Как я могу это сделать?

Могу ли я получить минимальный и максимальный ранг диапазона и случайный ранг между ними с помощью сценариев LUA?

Redis version: 5.0.2

1 Ответ

0 голосов
/ 20 мая 2019

Я решаю это с помощью следующего сценария:

-- 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 секунд.

...