0Pricing
Lua Academy · Урок

Словари общей памяти

Кэшируйте данные между рабочими процессами с помощью ngx.shared.DICT для быстрого поиска.

«Словари общей памяти» — бесплатный урок Lua Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.

Что такое ngx.shared.DICT

ngx.shared.DICT — это зона общей памяти, доступная всем рабочим процессам Nginx. Она предоставляет операции получения, установки и увеличения за O(1) для кэширования и координации.

Объявление общей памяти в nginx.conf

Выделите общие словари, указав имя и размер в блоке http.

# nginx.conf
http {
  lua_shared_dict rate_limit 10m;
  lua_shared_dict cache      50m;
  lua_shared_dict locks      1m;
}

Базовые операции получения и установки

Сохраняйте и извлекайте значения с необязательным TTL (сроком действия в секундах).

-- content_by_lua_block
local cache = ngx.shared.cache
cache:set("greeting", "Hello, World!", 60)  -- expires in 60s
local val = cache:get("greeting")
ngx.say(val)  -- Hello, World!

Атомарное увеличение

dict:incr(key, delta, init, expiry) атомарно увеличивает счётчик. Если ключ не существует, счётчик инициализируется значением init.

local rl = ngx.shared.rate_limit
local count = rl:incr("req:" .. ngx.var.remote_addr, 1, 0, 60)
if count > 100 then
  ngx.exit(429)  -- Too Many Requests
end

Ограничение частоты запросов с общей памятью

Шаблон с incr реализует простой ограничитель частоты запросов со скользящим окном — один из наиболее распространённых шаблонов OpenResty.

Удаление и очистка

dict:delete(key) удаляет один ключ. dict:flush_all() помечает все ключи как просроченные, выполняя ленивое удаление. dict:flush_expired(n) активно удаляет просроченные ключи.

Атомарное добавление

dict:add(key, val, expiry) устанавливает ключ, только если он ещё не существует, — это полезно для распределённых блокировок.

local locks = ngx.shared.locks
local ok, err = locks:add("my_lock", true, 5)  -- 5s lock
if not ok then
  ngx.say("Lock held, try later")
  return
end
-- critical section
-- locks:delete("my_lock")  -- release

Планирование размера общей памяти

Каждая пара ключ–значение имеет служебные накладные расходы (~100 байт). Оценка: size_mb * 1024^2 / avg_entry_size = максимальное число записей. Контролируйте использование с помощью dict:capacity() и dict:free_space().

Вытеснение из памяти

Когда словарь заполнен, OpenResty вытесняет самые старые записи, чтобы освободить место. Устанавливайте подходящие значения TTL, чтобы управлять вытеснением.

Координация между рабочими процессами

Поскольку все рабочие процессы используют один и тот же словарь, применяйте :add для выбора лидера, а :incr — для глобальных счётчиков во всех рабочих процессах.

Ограничения

Общие словари поддерживают только скалярные значения (строка, число, логическое значение). Сохраняйте таблицы, предварительно сериализовав их в JSON с помощью cjson.

Вопрос об общей памяти

Что делает dict:incr(key, 1, 0, 60)?

Итоги: словари общей памяти

ngx.shared.DICT предоставляет атомарные операции получения, установки и увеличения за O(1) во всех рабочих процессах. Используйте его для ограничения частоты запросов, кэширования и распределённых блокировок. Устанавливайте TTL, чтобы управлять вытеснением. Сериализуйте таблицы в JSON для сложных значений.

Часто задаваемые вопросы

Урок «Словари общей памяти» бесплатный?

Да — полный текст урока «Словари общей памяти» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.

Чему я научусь в уроке «Словари общей памяти»?

Кэшируйте данные между рабочими процессами с помощью ngx.shared.DICT для быстрого поиска. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Lua Academy?

Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Словари общей памяти»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Lua Academy?

Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Архитектура OpenResty
  2. Обработка HTTP-запросов в Lua
  3. Сокеты-сопрограммы и неблокирующий TCP
  4. Словари общей памяти
← Назад к Lua Academy