tlc: Caché general de dos niveles (lrucache + diccionario compartido)
Instalación
Si no has configurado la suscripción al repositorio RPM, regístrate. Luego puedes proceder con los siguientes pasos.
CentOS/RHEL 7 o 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 con NGINX, asegúrate de que nginx-module-lua esté instalado.
Este documento describe lua-resty-tlc v0.2 lanzado el 03 de octubre de 2016.
Implementación de Caché de Dos Capas utilizando lua-resty-lrucache y diccionarios compartidos.
Las entradas de caché se escriben en lru-cache en el trabajador actual y en un diccionario compartido.
Las lecturas de caché que no se encuentran en la instancia de lru-cache del trabajador se vuelven a poblar desde el diccionario compartido si está disponible.
Los valores en los diccionarios compartidos se serializan y deserializan automáticamente a JSON (se admiten funciones de serialización personalizadas).
También proporciona un módulo de administrador para mantener un conjunto global de instancias de caché TLC.
Resumen
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)
Crea una nueva instancia de resty.tlc.cache con el nombre/id y opciones dados.
No verificará si la instancia ya existe, las instancias existentes serán sobrescritas.
get
syntax: cache = manager.get(name)
Devuelve la instancia de caché TLC especificada o nil.
delete
syntax: manager.delete(name)
Elimina la instancia de caché especificada.
list
syntax: instances = manager.list()
Devuelve una tabla de array de las instancias de caché disponibles.
cache
new
syntax: instance = cache:new(opts)
Crea una nueva instancia de resty.tlc.cache, opts es una tabla de opciones para esta instancia.
opts = {
dict = dict, -- Nombre del diccionario compartido, requerido
size = size, -- parámetro max_items para la caché LRU, opcional, por defecto 200
pureffi = pureffi, -- Usar la variante de caché LRU pureffi, opcional, por defecto false
loadfactor = loadfactor, -- Factor de carga para la caché LRU pureffi, opcional
serialiser = serialiser, -- Función para serializar valores al guardar en el diccionario compartido, opcional, por defecto pcall'd cjson encode
unserialiser = unserialiser, -- Función para deserializar valores al guardar en el diccionario compartido, opcional, por defecto pcall'd cjson decode
}
Las funciones para serializar y deserializar deben return nil, err en caso de fallo.
set
syntax: ok, err = cache:set(key, value, ttl?)
Establece o actualiza una entrada en la caché.
ttl es opcional y en segundos.
get
syntax: data = cache:get(key)
Devuelve datos de la caché o nil si no está establecido.
delete
syntax: cache:delete(key)
Elimina la entrada tanto de la caché LRU como del diccionario compartido.
TODO: Eliminar de la caché LRU en todos los trabajadores.
flush
syntax: cache:flush(hard?)
Reinicializa la caché LRU en el trabajador actual y vacía el diccionario compartido.
El argumento hard también llamará a flush_expired() en el diccionario.
TODO: Reinicializar la caché LRU en todos los trabajadores.
GitHub
Puedes encontrar consejos adicionales de configuración y documentación para este módulo en el repositorio de GitHub para nginx-module-tlc.