0Pricing
Lua Academy · Урок

Ограничение частоты запросов с 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 — локальная установка не требуется.

Все уроки этого курса

  1. EVAL и окружение Redis Lua
  2. Атомарные операции и транзакции
  3. Ограничение частоты запросов с Lua
  4. SCRIPT LOAD и EVALSHA
← Назад к Lua Academy