Проверяет понимание механизма TTL в Redis и умение применять его для ограничения частоты запросов (rate limiting) в распределённых системах.
Rate limiting — это техника ограничения количества запросов, которые клиент может выполнить за определённый промежуток времени. Redis идеально подходит для этой задачи, потому что работает в памяти, поддерживает атомарные операции и умеет автоматически удалять ключи по истечении TTL. Это позволяет реализовать счётчик с окном без ручной очистки.
Идея проста: для каждого клиента (например, по IP или user_id) создаётся ключ вида rate:user:123. При каждом запросе выполняется INCR, а при первом инкременте — EXPIRE на нужное окно (например, 60 секунд). Если значение превышает лимит, запрос отклоняется.
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local window = tonumber(ARGV[2])
local current = redis.call('INCR', key)
if current == 1 then
redis.call('EXPIRE', key, window)
end
if current > limit then
return 0
end
return 1Этот скрипт на Lua выполняется атомарно, что исключает гонки между INCR и EXPIRE. Вызов из приложения:
const allowed = await redis.eval(script, 1, `rate:${userId}`, 100, 60);
if (!allowed) throw new Error('Too Many Requests');Для простых случаев можно использовать SET key value EX 60 NX — если ключ не существует, он создаётся с TTL. Это удобно для блокировок, но не для подсчёта.
Итог: TTL в Redis — это лёгкий и эффективный способ реализовать rate limiting через счётчик с окном. Подход стоит применять, когда нужна простая защита API от перегрузки и нет требований к идеально ровному распределению запросов во времени.