Saltar a contenido

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.