Используйте XRANGE myStream - + COUNT 1
для получения первой записи.
Используйте XREVRANGE myStream + - COUNT 1
для получения последней записи.
XINFO STREAM myStream
также приносит первую и последнюю запись, но the документы говорят, что это O(log N)
.
Если вы используете метку времени в качестве идентификатора или в качестве поля, то вы можете вычислить разницу во времени.
Если вы используете Redis Автоматический идентификатор потоков (XADD myStream * ...
), первая часть идентификатора - отметка времени UNIX в миллисекундах.
Принимая вышеизложенное, вы можете выполнить проверку атомарно с помощью сценария Lua:
EVAL "local first = redis.call('XRANGE', KEYS[1], '-', '+', 'COUNT', '1') local firstTime = {} if next(first) == nil then return redis.error_reply('Stream is empty or key doesn`t exist') end for str in string.gmatch(first[1][1], '([^-]+)') do table.insert(firstTime, tonumber(str)) end local last = redis.call('XREVRANGE', KEYS[1], '+', '-', 'COUNT', '1') local lastTime = {} for str in string.gmatch(last[1][1], '([^-]+)') do table.insert(lastTime, tonumber(str)) end local ms = lastTime[1] - firstTime[1] if ms >= tonumber(ARGV[1]) then return redis.call('XRANGE', KEYS[1], '-', '+') else return redis.error_reply('Only '..ms..' ms') end" 1 myStream 50
Аргументы: numKeys(1 here) streamKey timeInMs(50 here)
: 1 myStream 50
.
Здесь дружественный взгляд на скрипт Lua:
local first = redis.call('XRANGE', KEYS[1], '-', '+', 'COUNT', '1')
local firstTime = {}
if next(first) == nil then
return redis.error_reply('Stream is empty or key doesn`t exist')
end
for str in string.gmatch(first[1][1], '([^-]+)') do
table.insert(firstTime, tonumber(str))
end
local last = redis.call('XREVRANGE', KEYS[1], '+', '-', 'COUNT', '1')
local lastTime = {}
for str in string.gmatch(last[1][1], '([^-]+)') do
table.insert(lastTime, tonumber(str))
end
local ms = lastTime[1] - firstTime[1]
if ms >= tonumber(ARGV[1]) then
return redis.call('XRANGE', KEYS[1], '-', '+')
else
return redis.error_reply('Only '..ms..' ms')
end
Возвращает:
(error) Stream is empty or key doesn`t exist
(error) Only 34 ms
, если у нас нет требуемого времени - Фактический список записей, если истекло требуемое время между первым и последним сообщением .
Обязательно отметьте Введение в Redis Streams , чтобы ознакомиться с Redis Streams, и команду EVAL , чтобы узнать о * 1 048 * скриптов.