Перейти к содержанию

tlc: Общий двухуровневый кэш (lrucache + shared dict)

Установка

Если вы еще не настроили подписку на RPM репозиторий, зарегистрируйтесь. После этого вы можете продолжить с следующими шагами.

CentOS/RHEL 7 или Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-tlc

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-tlc

Чтобы использовать эту библиотеку Lua с NGINX, убедитесь, что nginx-module-lua установлен.

Этот документ описывает lua-resty-tlc v0.2, выпущенную 3 октября 2016 года.


Реализация двухуровневого кэша с использованием lua-resty-lrucache и shared dictionaries.

Записи кэша записываются в lru-cache в текущем рабочем процессе и в общий словарь.

Чтения кэша, которые отсутствуют в экземпляре lru-cache рабочего процесса, повторно заполняются из общего словаря, если он доступен.

Значения в общих словарях автоматически сериализуются и десериализуются в JSON (поддерживаются пользовательские функции сериализации).

Также предоставляет модуль менеджера для поддержания глобального набора экземпляров TLC кэша.

Обзор

lua_shared_dict tlc_cache 10m;
lua_shared_dict tlc_cache2 1m;

init_by_lua_block {
    local manager = require("resty.tlc.manager")
    manager.new("my_cache", {size = 500, dict = "tlc_cache"})

    manager.new("my_cache2", {size = 500, dict = "tlc_cache2"})
}

location = /get {
    content_by_lua_block {
        local manager = require("resty.tlc.manager")
        local cache = manager.get("my_cache")

        local args = ngx.req.get_uri_args()
        local key = args["key"]

        local data, err = cache:get(key)
        if err then
            ngx.log(ngx.ERR, err)
        elseif data == nil then
            ngx.status = ngx.HTTP_NOT_FOUND
            ngx.say("Не найдено")
        else
            ngx.say(tostring(data))
        end
    }
}

location = /set {
    content_by_lua_block {
        local manager = require("resty.tlc.manager")
        local cache = manager.get("my_cache")

        local args = ngx.req.get_uri_args()
        local key = args["key"]
        local val = args["val"] or { foo = bar }
        local ttl = args["ttl"]

        local ok, err = cache:set(key, val, ttl)
        if not ok then
            ngx.log(ngx.ERR, err)
        end
    }
}

location = /flush {
    content_by_lua_block {
        local manager = require("resty.tlc.manager")
        local cache = manager.get("my_cache")
        cache:flush()
    }
}

location = /list {
    content_by_lua_block {
        local manager = require("resty.tlc.manager")
        local instances = manager.list()

        ngx.say(require("cjson").encode(instances))
    }
}

Методы

manager

new

syntax: ok, err = manager.new(name, opts)

Создает новый экземпляр resty.tlc.cache с заданным именем/id и параметрами.

Не будет проверять, существует ли экземпляр уже, существующие экземпляры будут перезаписаны.

get

syntax: cache = manager.get(name)

Возвращает указанный экземпляр TLC кэша или nil.

delete

syntax: manager.delete(name)

Удаляет указанный экземпляр кэша.

list

syntax: instances = manager.list()

Возвращает массив таблиц доступных экземпляров кэша.

cache

new

syntax: instance = cache:new(opts)

Создает новый экземпляр resty.tlc.cache, opts — это таблица параметров для этого экземпляра.

opts = {
    dict         = dict,         -- Имя общего словаря, обязательно
    size         = size,         -- параметр max_items для LRU кэша, необязательно, по умолчанию 200
    pureffi      = pureffi,      -- Использовать вариант LRU кэша pureffi, необязательно, по умолчанию false
    loadfactor   = loadfactor,   -- Коэффициент загрузки для LRU кэша pureffi, необязательно
    serialiser   = serialiser,   -- Функция для сериализации значений при сохранении в общий словарь, необязательно, по умолчанию pcall'd cjson encode
    unserialiser = unserialiser, -- Функция для десериализации значений при сохранении в общий словарь, необязательно, по умолчанию pcall'd cjson decode
}

Функции для сериализации и десериализации должны return nil, err в случае неудачи.

set

syntax: ok, err = cache:set(key, value, ttl?)

Устанавливает или обновляет запись в кэше.

ttl является необязательным и указывается в секундах.

get

syntax: data = cache:get(key)

Возвращает данные из кэша или nil, если не установлено.

delete

syntax: cache:delete(key)

Удаляет запись как из LRU кэша, так и из общего словаря.

TODO: Удалить из LRU кэша во всех рабочих процессах.

flush

syntax: cache:flush(hard?)

Переинициализирует LRU кэш в текущем рабочем процессе и очищает общий словарь.

Аргумент hard также вызовет flush_expired() на словаре.

TODO: Переинициализировать LRU кэш во всех рабочих процессах.

GitHub

Вы можете найти дополнительные советы по настройке и документацию для этого модуля в репозитории GitHub для nginx-module-tlc.