tlc: Allgemeiner zweistufiger Cache (lrucache + shared dict)
Installation
Wenn Sie das RPM-Repository-Abonnement noch nicht eingerichtet haben, melden Sie sich an. Dann können Sie mit den folgenden Schritten fortfahren.
CentOS/RHEL 7 oder 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
Um diese Lua-Bibliothek mit NGINX zu verwenden, stellen Sie sicher, dass nginx-module-lua installiert ist.
Dieses Dokument beschreibt lua-resty-tlc v0.2, das am 03. Oktober 2016 veröffentlicht wurde.
Zwei-Layer-Cache-Implementierung unter Verwendung von lua-resty-lrucache und shared dictionaries.
Cache-Einträge werden im lru-cache des aktuellen Workers und in einem Shared Dictionary geschrieben.
Cache-Lesevorgänge, die im lru-cache-Instanz des Workers nicht vorhanden sind, werden aus dem Shared Dictionary neu befüllt, sofern verfügbar.
Werte in Shared Dictionaries werden automatisch in JSON serialisiert und deserialisiert (benutzerdefinierte Serialisierungsfunktionen werden unterstützt).
Bietet auch ein Manager-Modul zur Verwaltung eines globalen Satzes von TLC-Cache-Instanzen.
Übersicht
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))
}
}
Methoden
manager
new
syntax: ok, err = manager.new(name, opts)
Erstellt eine neue resty.tlc.cache-Instanz mit dem angegebenen Namen/ID und Optionen.
Es wird nicht überprüft, ob die Instanz bereits existiert; bestehende Instanzen werden überschrieben.
get
syntax: cache = manager.get(name)
Gibt die angegebene TLC-Cache-Instanz oder nil zurück.
delete
syntax: manager.delete(name)
Entfernt die angegebene Cache-Instanz.
list
syntax: instances = manager.list()
Gibt eine Array-Tabelle der verfügbaren Cache-Instanzen zurück.
cache
new
syntax: instance = cache:new(opts)
Erstellt eine neue Instanz von resty.tlc.cache, opts ist eine Tabelle von Optionen für diese Instanz.
opts = {
dict = dict, -- Name des Shared Dictionary, erforderlich
size = size, -- max_items-Parameter für den LRU-Cache, optional, Standard 200
pureffi = pureffi, -- Verwenden Sie die pureffi LRU-Cache-Variante, optional, Standard false
loadfactor = loadfactor, -- Lastfaktor für den pureffi LRU-Cache, optional
serialiser = serialiser, -- Funktion zur Serialisierung von Werten beim Speichern im Shared Dictionary, optional, Standard ist pcall'd cjson encode
unserialiser = unserialiser, -- Funktion zur Deserialisierung von Werten beim Speichern im Shared Dictionary, optional, Standard ist pcall'd cjson decode
}
Funktionen zur Serialisierung und Deserialisierung sollten nil, err im Fehlerfall zurückgeben.
set
syntax: ok, err = cache:set(key, value, ttl?)
Setzt oder aktualisiert einen Eintrag im Cache.
ttl ist optional und in Sekunden.
get
syntax: data = cache:get(key)
Gibt Daten aus dem Cache zurück oder nil, wenn nicht gesetzt.
delete
syntax: cache:delete(key)
Löscht den Eintrag sowohl aus dem LRU-Cache als auch aus dem Shared Dictionary.
TODO: Löschen aus dem LRU-Cache in allen Workern.
flush
syntax: cache:flush(hard?)
Initialisiert den LRU-Cache im aktuellen Worker neu und leert das Shared Dictionary.
Das hard-Argument ruft auch flush_expired() im Dictionary auf.
TODO: LRU-Cache in allen Workern neu initialisieren.
GitHub
Sie finden möglicherweise zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub-Repository für nginx-module-tlc.