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.