Redis-Client für Go (Golang): go-redis und redigo – vollständiger Leitfaden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Redis-Client für Go (Golang): go-redis und redigo

\n\n

Redis ist ein Hochleistungs-In-Memory-Datenspeicher, der häufig als Datenbank, Cache und Nachrichtenbroker verwendet wird. Für die Arbeit mit Redis in der Sprache Go (Golang) gibt es mehrere beliebte Clients. In diesem Artikel betrachten wir zwei Hauptbibliotheken im Detail: go-redis (die beliebteste und modernste Option) und redigo (niedrigschwelliger, aber bewährt).

\n\n

Wir zeigen, wie man jede von ihnen installiert, eine Verbindung zum Server herstellt, grundlegende Operationen durchführt, mit einem Verbindungspool arbeitet, Pub/Sub und Pipeline verwendet. Das Material ist sowohl für Anfänger als auch für erfahrene Entwickler nützlich, die Redis in ihre Go-Anwendungen integrieren möchten.

\n\n

1. go-redis – moderner und funktionsreicher Client

\n\n

go-redis ist eine in Go geschriebene Client-Bibliothek für Redis. Sie unterstützt alle wichtigen Funktionen von Redis 6 und 7, einschließlich Clustering, Sentinel, Pub/Sub, Transaktionen, Pipeline und Lua-Skripte. Die Bibliothek wird aktiv weiterentwickelt und bietet eine benutzerfreundliche API.

\n\n

Installation von go-redis

\n

Führen Sie zur Installation den folgenden Befehl im Terminal aus:

\n
go get github.com/redis/go-redis/v9
\n\n

Verbindung und grundlegende Operationen

\n

Beispiel einer einfachen Anwendung, die eine Verbindung zu Redis herstellt, Daten schreibt und liest:

\n
package main\n\nimport (\n    "context"\n    "fmt"\n    "github.com/redis/go-redis/v9"\n)\n\nfunc main() {\n    ctx := context.Background()\n\n    // Client erstellen\n    rdb := redis.NewClient(&redis.Options{\n        Addr:     "localhost:6379",\n        Password: "", // ohne Passwort\n        DB:       0,  // Standarddatenbank\n    })\n\n    // Verbindung prüfen\n    pong, err := rdb.Ping(ctx).Result()\n    if err != nil {\n        panic(err)\n    }\n    fmt.Println(pong) // PONG\n\n    // Wert schreiben\n    err = rdb.Set(ctx, "key", "hello from Go", 0).Err()\n    if err != nil {\n        panic(err)\n    }\n\n    // Wert lesen\n    val, err := rdb.Get(ctx, "key").Result()\n    if err != nil {\n        panic(err)\n    }\n    fmt.Println("key:", val)\n}
\n\n

Arbeiten mit Hashes, Listen und Mengen

\n

go-redis unterstützt alle Redis-Datentypen. Beispiel für die Arbeit mit einem Hash:

\n
// Hash schreiben\nerr := rdb.HSet(ctx, "user:1000", map[string]interface{}{\n    "name":  "Alice",\n    "age":   30,\n    "city":  "Moscow",\n}).Err()\nif err != nil {\n    panic(err)\n}\n\n// Ein Feld lesen\nname, err := rdb.HGet(ctx, "user:1000", "name").Result()\nfmt.Println("Name:", name)\n\n// Ganzen Hash lesen\nuser, err := rdb.HGetAll(ctx, "user:1000").Result()\nfmt.Println("User:", user)
\n\n

Verbindungspool und Konfiguration

\n

go-redis verwaltet den Verbindungspool automatisch. Sie können dessen Größe anpassen:

\n
rdb := redis.NewClient(&redis.Options{\n    Addr:         "localhost:6379",\n    PoolSize:     10, // maximale Anzahl von Verbindungen im Pool\n    MinIdleConns: 3,  // minimale Anzahl von Leerlaufverbindungen\n})
\n\n

Pub/Sub (Publisher-Subscriber)

\n

Beispiel für das Abonnieren eines Kanals und das Veröffentlichen einer Nachricht:

\n
// Abonnieren\nsub := rdb.Subscribe(ctx, "mychannel")\nch := sub.Channel()\n\n// In einer separaten Goroutine Nachrichten empfangen\ngo func() {\n    for msg := range ch {\n        fmt.Printf("Received: %s from %s\\n", msg.Payload, msg.Channel)\n    }\n}()\n\n// Veröffentlichen\nerr := rdb.Publish(ctx, "mychannel", "Hello subscribers!").Err()
\n\n

Pipeline

\n

Ermöglicht das Senden mehrerer Befehle in einer einzigen Anfrage, was die Arbeit erheblich beschleunigt:

\n
pipe := rdb.Pipeline()\n\nincr := pipe.Incr(ctx, "counter")\npipe.Expire(ctx, "counter", time.Hour)\n\n// Alle Befehle ausführen\n_, err := pipe.Exec(ctx)\nif err != nil {\n    panic(err)\n}\nfmt.Println("Counter:", incr.Val())
\n\n

2. Redig

Empfehlungen