Ограничение частоты запросов с Lua
Атомарно реализуйте ограничители частоты запросов со скользящим окном в Redis Lua.
«Ограничение частоты запросов с Lua» — бесплатный урок Lua Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Зачем Redis для ограничения частоты запросов?
Redis предоставляет атомарные операции, высокую скорость работы в памяти и общее состояние для нескольких серверов приложения, что делает его идеальным для распределённого ограничения частоты запросов.
Простой счётчик фиксированного окна
Подсчитывайте запросы в каждом временном окне с помощью INCR и EXPIRE.
EVAL "
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local window = tonumber(ARGV[2])
local count = redis.call('INCR', key)
if count == 1 then
redis.call('EXPIRE', key, window)
end
if count > limit then
return 0 -- rejected
end
return 1 -- allowed
" 1 rate:user:123 100 60Скользящее окно с сортированными множествами
Более точный ограничитель частоты запросов использует сортированное множество с ключами, основанными на временных метках. Удаляйте старые записи, добавляйте текущий запрос и подсчитывайте размер множества.
EVAL "
local key = KEYS[1]
local now = tonumber(ARGV[1])
local window = tonumber(ARGV[2])
local limit = tonumber(ARGV[3])
redis.call('ZREMRANGEBYSCORE', key, 0, now - window * 1000)
redis.call('ZADD', key, now, now .. math.random())
redis.call('EXPIRE', key, window)
local count = redis.call('ZCARD', key)
if count > limit then return 0 end
return 1
" 1 slidingRate:user:123 1706000000000 60 100Алгоритм token bucket
Алгоритм token bucket позволяет обрабатывать всплески запросов, сохраняя среднюю скорость. Пополняйте запас токенов со временем; каждый запрос расходует один токен.
Алгоритм leaky bucket
Алгоритм leaky bucket обеспечивает строго постоянную скорость. Запросы помещаются в очередь (ведро) и обрабатываются с фиксированной скоростью опустошения. При переполнении запрос отклоняется.
Ограничения для пользователя и IP
Создавайте ключ ограничителя частоты запросов на основе ID пользователя, ключа API или IP-адреса: rate:{userId}, rate:{ip}, rate:{apiKey}.
Многоуровневые ограничения частоты запросов
Применяйте разные ограничения в зависимости от уровня пользователя (бесплатный или профессиональный). Перед выбором ограничения проверьте уровень пользователя.
EVAL "
local tier = redis.call('HGET', 'user:tier', ARGV[1])
local limit = tier == 'pro' and 10000 or 1000
-- ... rest of rate limit check
" 0 "userId123"Возврат заголовков
Возвращайте из скрипта количество оставшихся запросов и время сброса, чтобы приложение могло установить заголовки X-RateLimit в HTTP-ответе.
return {allowed, limit - count, resetTime}Распределённая гарантия атомарности
Поскольку вся проверка ограничения частоты запросов выполняется в одном скрипте EVAL, она атомарна для всех экземпляров серверов приложения, использующих общий кластер Redis.
Примечание о кластере Redis
В режиме кластера Redis все KEYS, используемые в скрипте, должны хешироваться в один и тот же слот. Используйте хеш-теги: rate:{user123}:requests, чтобы принудительно разместить их вместе.
Мониторинг ограничений частоты запросов
Записывайте в журнал отклонённые запросы с информацией о пользователе и IP. Настройте оповещения при резком росте доли отклонений — это может указывать на атаку или неправильную настройку.
Вопрос об ограничении частоты запросов
Почему скрипт Lua в Redis лучше подходит для ограничения частоты запросов, чем счётчики на стороне приложения?
Повторение: ограничение частоты запросов с помощью Lua
Реализуйте ограничители частоты запросов в Redis Lua с помощью INCR+EXPIRE (фиксированное окно) или сортированных множеств (скользящее окно). Атомарный скрипт гарантирует корректность работы распределённых серверов приложения. Возвращайте оставшуюся квоту для HTTP-заголовков.
Часто задаваемые вопросы
Урок «Ограничение частоты запросов с Lua» бесплатный?
Да — полный текст урока «Ограничение частоты запросов с Lua» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Ограничение частоты запросов с Lua»?
Атомарно реализуйте ограничители частоты запросов со скользящим окном в Redis Lua. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Ограничение частоты запросов с Lua»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- EVAL и окружение Redis Lua
- Атомарные операции и транзакции
- Ограничение частоты запросов с Lua
- SCRIPT LOAD и EVALSHA