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.