Client Redis pour Go (Golang) : go-redis et redigo — guide complet

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Client Redis pour Go (Golang) : go-redis et redigo

\n\n

Redis est un magasin de données in-memory hautes performances, souvent utilisé comme base de données, cache et courtier de messages. Pour travailler avec Redis en langage Go (Golang), il existe plusieurs clients populaires. Dans cet article, nous examinerons en détail deux bibliothèques principales : go-redis (l'option la plus populaire et moderne) et redigo (plus bas niveau, mais éprouvée par le temps).

\n\n

Nous montrerons comment installer chacune d'elles, se connecter au serveur, effectuer des opérations de base, travailler avec un pool de connexions, utiliser pub/sub et le traitement par pipeline. Ce contenu sera utile aussi bien aux débutants qu'aux développeurs expérimentés souhaitant intégrer Redis dans leurs applications Go.

\n\n

1. go-redis — un client moderne et fonctionnel

\n\n

go-redis est une bibliothèque cliente pour Redis écrite en Go. Elle prend en charge toutes les fonctionnalités principales de Redis 6 et 7, y compris le clustering, Sentinel, pub/sub, les transactions, le pipeline et les scripts Lua. La bibliothèque est activement développée et dispose d'une API pratique.

\n\n

Installation de go-redis

\n

Pour l'installation, exécutez la commande dans le terminal :

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

Connexion et opérations de base

\n

Exemple d'une application simple qui se connecte à Redis, écrit et lit des données :

\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    // Création du client\n    rdb := redis.NewClient(&redis.Options{\n        Addr:     "localhost:6379",\n        Password: "", // sans mot de passe\n        DB:       0,  // base de données par défaut\n    })\n\n    // Vérification de la connexion\n    pong, err := rdb.Ping(ctx).Result()\n    if err != nil {\n        panic(err)\n    }\n    fmt.Println(pong) // PONG\n\n    // Écriture d'une valeur\n    err = rdb.Set(ctx, "key", "hello from Go", 0).Err()\n    if err != nil {\n        panic(err)\n    }\n\n    // Lecture de la valeur\n    val, err := rdb.Get(ctx, "key").Result()\n    if err != nil {\n        panic(err)\n    }\n    fmt.Println("key:", val)\n}
\n\n

Travail avec les hachages, listes et ensembles

\n

go-redis prend en charge tous les types de données Redis. Exemple de travail avec un hachage :

\n
// Écriture d'un hachage\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// Lecture d'un champ\nname, err := rdb.HGet(ctx, "user:1000", "name").Result()\nfmt.Println("Name:", name)\n\n// Lecture de tout le hachage\nuser, err := rdb.HGetAll(ctx, "user:1000").Result()\nfmt.Println("User:", user)
\n\n

Pool de connexions et configuration

\n

go-redis gère automatiquement le pool de connexions. Vous pouvez configurer sa taille :

\n
rdb := redis.NewClient(&redis.Options{\n    Addr:         "localhost:6379",\n    PoolSize:     10, // nombre maximum de connexions dans le pool\n    MinIdleConns: 3,  // nombre minimum de connexions inactives\n})
\n\n

Pub/Sub (éditeur-abonné)

\n

Exemple d'abonnement à un canal et de publication d'un message :

\n
// Abonnement\nsub := rdb.Subscribe(ctx, "mychannel")\nch := sub.Channel()\n\n// Dans une goroutine séparée, écoute des messages\ngo func() {\n    for msg := range ch {\n        fmt.Printf("Received: %s from %s\\n", msg.Payload, msg.Channel)\n    }\n}()\n\n// Publication\nerr := rdb.Publish(ctx, "mychannel", "Hello subscribers!").Err()
\n\n

Pipeline (conduit)

\n

Permet d'envoyer plusieurs commandes en une seule requête, ce qui accélère considérablement le travail :

\n
pipe := rdb.Pipeline()\n\nincr := pipe.Incr(ctx, "counter")\npipe.Expire(ctx, "counter", time.Hour)\n\n// Exécution de toutes les commandes\n_, err := pipe.Exec(ctx)\nif err != nil {\n    panic(err)\n}\nfmt.Println("Counter:", incr.Val())
\n\n

2. Redig

Recommendations