Aller au contenu

tlc: Cache général à deux niveaux (lrucache + dictionnaire partagé)

Installation

Si vous n'avez pas configuré l'abonnement au dépôt RPM, inscrivez-vous. Ensuite, vous pouvez procéder avec les étapes suivantes.

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

Pour utiliser cette bibliothèque Lua avec NGINX, assurez-vous que nginx-module-lua est installé.

Ce document décrit lua-resty-tlc v0.2 publié le 03 octobre 2016.


Implémentation du cache à deux niveaux utilisant lua-resty-lrucache et dictionnaires partagés.

Les entrées du cache sont écrites dans le lru-cache du worker actuel et dans un dictionnaire partagé.

Les lectures du cache qui ne trouvent pas dans l'instance lru-cache du worker sont re-populées à partir du dictionnaire partagé si disponible.

Les valeurs dans les dictionnaires partagés sont automatiquement sérialisées et désérialisées en JSON (des fonctions de sérialisation personnalisées sont prises en charge).

Fournit également un module de gestion pour maintenir un ensemble global d'instances de cache TLC.

Aperçu

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éthodes

manager

new

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

Crée une nouvelle instance de resty.tlc.cache avec le nom/id et les options donnés.

Ne vérifie pas si l'instance existe déjà, les instances existantes seront écrasées.

get

syntax: cache = manager.get(name)

Renvoie l'instance de cache TLC spécifiée ou nil.

delete

syntax: manager.delete(name)

Supprime l'instance de cache spécifiée.

list

syntax: instances = manager.list()

Renvoie un tableau des instances de cache disponibles.

cache

new

syntax: instance = cache:new(opts)

Crée une nouvelle instance de resty.tlc.cache, opts est une table d'options pour cette instance.

opts = {
    dict         = dict,         -- Nom du dictionnaire partagé, requis
    size         = size,         -- paramètre max_items pour le cache LRU, optionnel, par défaut 200
    pureffi      = pureffi,      -- Utiliser la variante LRU cache pureffi, optionnel, par défaut faux
    loadfactor   = loadfactor,   -- Facteur de charge pour le cache LRU pureffi, optionnel
    serialiser   = serialiser,   -- Fonction pour sérialiser les valeurs lors de l'enregistrement dans le dictionnaire partagé, optionnel, par défaut à l'encodage cjson appelé avec pcall
    unserialiser = unserialiser, -- Fonction pour désérialiser les valeurs lors de l'enregistrement dans le dictionnaire partagé, optionnel, par défaut à la décodage cjson appelé avec pcall
}

Les fonctions de sérialisation et de désérialisation doivent return nil, err en cas d'échec.

set

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

Définit ou met à jour une entrée dans le cache.

ttl est optionnel et en secondes.

get

syntax: data = cache:get(key)

Renvoie des données du cache ou nil si non défini.

delete

syntax: cache:delete(key)

Supprime l'entrée à la fois du cache LRU et du dictionnaire partagé.

TODO: Supprimer du cache LRU dans tous les workers.

flush

syntax: cache:flush(hard?)

Réinitialise le cache LRU dans le worker actuel et vide le dictionnaire partagé.

L'argument hard appellera également flush_expired() sur le dictionnaire.

TODO: Réinitialiser le cache LRU dans tous les workers.

GitHub

Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-tlc.