Zum Inhalt

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.