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.