Zum Inhalt

redis-util: Nginx-module-lua-resty-redis Wrapper-Klasse

Installation

Wenn Sie das RPM-Repository-Abonnement noch nicht eingerichtet haben, melden Sie sich an. Danach 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-redis-util

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-redis-util

Um diese Lua-Bibliothek mit NGINX zu verwenden, stellen Sie sicher, dass nginx-module-lua installiert ist.

Dieses Dokument beschreibt lua-resty-redis-util v0.7, das am 15. Dezember 2021 veröffentlicht wurde.


Einführung

Dieses Projekt basiert auf [openresty/lua-resty-redis][] und wurde von [Zhang Yichun (agentzh)][agentzh] entwickelt. Es ist eine Wrapper-Bibliothek für die Redis-Operationen in OpenResty. Die Kernfunktionalität wird weiterhin von [openresty/lua-resty-redis][] bereitgestellt.

Dieser Artikel setzt voraus, dass Sie bereits mit nginx+lua oder OpenResty und der Verwendung von Lua-Skripten (z.B. lua_package_path-Konfiguration, *_by_lua_file) vertraut sind, grundlegende Kenntnisse über Redis haben und die grundlegende Verwendung von [openresty/lua-resty-redis][] kennen ([openresty/lua-resty-redis#README.md][README.md]).

Installation

opm get anjia0532/lua-resty-redis-util

Vergleich

Hier ist ein Auszug aus dem offiziellen Code zur Erklärung:

    local redis = require "resty.redis"
    local red = redis:new()

    red:set_timeout(1000) -- 1 Sekunde -- Setze die Timeout-Zeit

    local ok, err = red:connect("127.0.0.1", 6379) -- Setze Host und Port für Redis
    if not ok then -- Überprüfe, ob die Verbindung fehlgeschlagen ist
        ngx.say("Verbindung fehlgeschlagen: ", err)
        return
    end

    ok, err = red:set("dog", "ein Tier") -- Füge einen Schlüsselwert ein (ähnlich wie MySQL Insert)
    if not ok then -- Überprüfe, ob die Operation erfolgreich war
        ngx.say("Fehler beim Setzen von dog: ", err)
        return
    end

    ngx.say("Setzergebnis: ", ok) -- Seite gibt Ergebnis aus
    -- Lege es in den Verbindungspool mit einer Größe von 100,
    -- mit 10 Sekunden maximaler Leerlaufzeit
    local ok, err = red:set_keepalive(10000, 100) -- Lege die Verbindung in den Verbindungspool, 100 Verbindungen, maximal 10 Sekunden Leerlaufzeit
    if not ok then -- Überprüfe das Ergebnis des Einlegens
        ngx.say("Fehler beim Setzen von Keepalive: ", err)
        return
    end
    -- Wenn Sie es nicht in den Pool legen und es sofort schließen möchten, verwenden Sie die folgende Schreibweise
    -- oder schließen Sie die Verbindung sofort:
    -- local ok, err = red:close()
    -- if not ok then
    --     ngx.say("Fehler beim Schließen: ", err)
    --     return
    -- end

Wenn Sie objektorientierte Sprachen wie Java oder C# verwendet haben, werden Sie feststellen, dass dieser Schreibstil zu viele unwichtige Details offenbart und zu viel wiederholten Code führt.

Hier ist der gleiche Inhalt, jedoch mit meinem Wrapper-Code. Die Einstellungen für den Verbindungspool, das Abrufen von Verbindungen und das Zurücklegen in den Verbindungspool sind verborgen.

    -- Abhängige Bibliothek
    local redis = require "resty.redis-util"
    -- Initialisierung
    local red = redis:new();
    -- Füge einen Schlüsselwert ein
    local ok, err = red:set("dog", "ein Tier")
    -- Überprüfe das Ergebnis
    if not ok then
      ngx.say("Fehler beim Setzen von dog:", err)
      return
    end
    -- Seite gibt Ergebnis aus
    ngx.say("Setzergebnis: ", ok) -- Seite gibt Ergebnis aus

Hinweise

Standardwerte

local red = redis:new();
-- verwendet Standardwerte, entspricht
local red2 = redis:new({
                            host='127.0.0.1',
                            port=6379,
                            db_index=0,
                            password=nil,
                            timeout=1000,
                            keepalive=60000,
                            pool_size=100
                        });
  • host: Redis-Host, Standard: 127.0.0.1
  • port: Redis-Port, Standard: 6379
  • db_index: Redis-Datenbankindex (Standard 0-15, insgesamt 16 Datenbanken), die Standarddatenbank ist 0 (es wird empfohlen, verschiedene Ports für verschiedene Instanzen oder unterschiedliche Präfixe zu verwenden, da der Wechsel der Datenbank den Befehl select erfordert), Standard: 0
  • password: Passwort für die Redis-Authentifizierung
  • timeout: Redis-Verbindungs-Timeout, Standard: 1000 (1s)
  • keepalive: Maximale Leerlaufzeit des Redis-Verbindungspools, Standard: 60000 (1m)
  • pool_size: Größe des Redis-Verbindungspools, Standard: 100

subscribe

Da pub/sub nicht verwendet wird, wurde nur eine einfache Implementierung von (un)subscribe durchgeführt, ohne (un)psubscribe (Musterabonnierung) weiter zu implementieren. Siehe [Redis-API-Wrapping (Veröffentlichung und Abonnierung)][linkRedis接口的二次封装].

    local cjson = require "cjson"
    local red = redis:new();

    -- Abonniere den Kanal dog
    local func  = red:subscribe("dog")

    -- Überprüfe, ob das Abonnieren erfolgreich war
    if not func then
      return nil
    end

    -- Werte abrufen
    local res, err = func() -- func()=func(true)
    -- Wenn fehlgeschlagen, abbestellen
    if err then
        func(false)
    end

    -- Wenn ein Ergebnis abgerufen wurde, gebe es auf der Seite aus
    if res then
        ngx.say("1: empfangen: ", cjson.encode(res))
    end

    -- Erneut abrufen
    res, err = func()

    -- Nach erfolgreichem Abrufen abbestellen func(false)
    if res then
        ngx.say("2: empfangen: ", cjson.encode(res))
        func(false)
    end

pipeline

Siehe [openresty/lua-resty-redis#Synopsis][].

    local cjson = require "cjson"
    local red = redis:new();

    red:init_pipeline()

    red:set("cat", "Marry")
    red:set("horse", "Bob")
    red:get("cat")
    red:get("horse")

    local results, err = red:commit_pipeline()

    if not results then
        ngx.say("Fehler beim Commit der gepipelineden Anfragen: ", err)
        return
    else
        ngx.say("Pipeline", cjson.encode(results))
    end
    -- Ausgabe: pipeline["OK","OK","Marry","Bob"]

script

Siehe [Script zur Komprimierung komplexer Anfragen][linkScript压缩复杂请求].

    local red = redis:new();

    local id = 1
    local res, err = red:eval([[
        -- Beachten Sie, dass die aus KEYS/ARGV abgerufenen Werte vom Typ string sind, wenn das Skript in Redis ausgeführt wird
        local info = redis.call('get', KEYS[1])
        info = cjson.decode(info)
        local g_id = info.gid

        local g_info = redis.call('get', g_id)
        return g_info
        ]], 1, id)

    if not res then
       ngx.say("Fehler beim Abrufen der Gruppeninformation: ", err)
       return
    end

    ngx.say("Skript", res)

Dank

Dieses Tool basiert auf dem Code von [lua-resty-redis/lib/resty/redis.lua][] und [Redis-API-Wrapping][linkRedis接口的二次封装].

Feedback

Bei Fragen können Sie gerne [Issues][] einreichen.

GitHub

Sie finden zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub-Repository für nginx-module-redis-util.