Pular para conteúdo

tlc: Cache geral de dois níveis (lrucache + dicionário compartilhado)

Instalação

Se você ainda não configurou a assinatura do repositório RPM, inscreva-se. Em seguida, você pode prosseguir com os seguintes passos.

CentOS/RHEL 7 ou 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

Para usar esta biblioteca Lua com NGINX, certifique-se de que o nginx-module-lua está instalado.

Este documento descreve o lua-resty-tlc v0.2 lançado em 03 de outubro de 2016.


Implementação de Cache de Dois Níveis usando lua-resty-lrucache e dicionários compartilhados.

As entradas do cache são escritas no lru-cache no trabalhador atual e em um dicionário compartilhado.

As leituras de cache que não encontram no lru-cache do trabalhador são repopuladas a partir do dicionário compartilhado, se disponível.

Os valores em dicionários compartilhados são automaticamente serializados e desserializados para JSON (funções de serialização personalizadas são suportadas).

Também fornece um módulo gerenciador para manter um conjunto global de instâncias de cache TLC.

Visão Geral

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("Not Found")
        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))
    }
}

Métodos

manager

new

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

Cria uma nova instância de resty.tlc.cache com o nome/id e opções fornecidos.

Não verificará se a instância já existe, instâncias existentes serão sobrescritas.

get

syntax: cache = manager.get(name)

Retorna a instância de cache TLC especificada ou nil.

delete

syntax: manager.delete(name)

Remove a instância de cache especificada.

list

syntax: instances = manager.list()

Retorna uma tabela de array das instâncias de cache disponíveis.

cache

new

syntax: instance = cache:new(opts)

Cria uma nova instância de resty.tlc.cache, opts é uma tabela de opções para esta instância.

opts = {
    dict         = dict,         -- Nome do dicionário compartilhado, obrigatório
    size         = size,         -- parâmetro max_items para o cache LRU, opcional, padrão 200
    pureffi      = pureffi,      -- Usar a variante de cache LRU pureffi, opcional, padrão false
    loadfactor   = loadfactor,   -- Fator de carga para o cache LRU pureffi, opcional
    serialiser   = serialiser,   -- Função para serializar valores ao salvar no dicionário compartilhado, opcional, padrão para encode cjson chamado com pcall
    unserialiser = unserialiser, -- Função para desserializar valores ao salvar no dicionário compartilhado, opcional, padrão para decode cjson chamado com pcall
}

As funções para serializar e desserializar devem return nil, err em caso de falha.

set

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

Define ou atualiza uma entrada no cache.

ttl é opcional e em segundos.

get

syntax: data = cache:get(key)

Retorna dados do cache ou nil se não estiver definido.

delete

syntax: cache:delete(key)

Deleta a entrada tanto do cache LRU quanto do dicionário compartilhado.

TODO: Deletar do cache LRU em todos os trabalhadores.

flush

syntax: cache:flush(hard?)

Reinicializa o cache LRU no trabalhador atual e limpa o dicionário compartilhado.

O argumento hard também chamará flush_expired() no dicionário.

TODO: Reinicializar o cache LRU em todos os trabalhadores.

GitHub

Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório do GitHub para nginx-module-tlc.