Utilisation de Redis comme base de données avec go-redis (2023)

Dans le domaine du développement logiciel, Redis se distingue comme un système de stockage de données en mémoire polyvalent, servant de base de données, de cache et même de courtier de messages. Dans cet article, nous plongerons dans le client Redis pour Go, également connu sous le nom de "go-redis", et nous explorerons sa fonctionnalité de pipeline en construisant une API de classement. Cette API, construite avec Gin et les ensembles triés de Redis, expose des endpoints clés pour récupérer le score d'un utilisateur, ajouter ou mettre à jour un utilisateur avec son score, et obtenir le classement actuel.

Prérequis

Avant de plonger dans le code, assurez-vous de disposer d'une installation Go avec la prise en charge des modules et de Redis installé sur votre ordinateur local. Vous pouvez également utiliser l'image Docker si Docker est installé.

Mise en route

Créez un nouveau dossier pour le projet, initialisez votre module Go, et installez les dépendances nécessaires, y compris gin-gonic/gin et go-redis/redis. Ensuite, créez un fichier main.go comme point d'entrée du projet.

$ mkdir rediboard && cd rediboard
$ go mod init gitlab.com/idoko/rediboard
$ go get github.com/gin-gonic/gin github.com/go-redis/redis
$ touch main.go

Connexion à Redis avec Go

La connexion à la base de données Redis est gérée par le client, qui est un objet thread-safe partageable entre plusieurs goroutines. Le code ci-dessous illustre la création d'un nouveau client go-redis.

package db

import (
    "context"
    "errors"
    "github.com/go-redis/redis/v8"
)

type Database struct {
    Client *redis.Client
}

var (
    ErrNil = errors.New("aucun enregistrement correspondant trouvé dans la base de données Redis")
    Ctx    = context.TODO()
)

func NewDatabase(address string) (*Database, error) {
    client := redis.NewClient(&redis.Options{
        Addr:     address,
        Password: "",
        DB:       0,
    })
    if err := client.Ping(Ctx).Err(); err != nil {
        return nil, err
    }
    return &Database{
        Client: client,
    }, nil
}

Routes API avec Gin

Créez des routes pour l'API en utilisant le framework Gin. Pour le moment, la fonction initRouter renvoie simplement une instance de gin.Engine.

package main

import (
    "github.com/gin-gonic/gin"
    "gitlab.com/idoko/rediboard/db"
    "log"
    "net/http"
)

func initRouter(database *db.Database) *gin.Engine {
    r := gin.Default()
    // Ajoutez les gestionnaires d'itinéraires spécifiques ici
    return r
}

Pipelines de transaction avec go-redis

Les pipelines de transaction en go-redis offrent une file d'attente pour les opérations, assurant l'exécution de toutes ou aucune des opérations. Un autre aspect intéressant de Redis est le pipelining, une optimisation réseau qui permet à un client Redis d'envoyer plusieurs requêtes au serveur sans attendre de réponses.

// Exemple de code pour un pipeline de transaction
pipe := db.Client.TxPipeline()
pipe.Set(Ctx, "language", "golang")
pipe.Set(Ctx, "year", 2009)
results, err := pipe.Exec()

Sauvegarder les utilisateurs dans les ensembles triés

Créez un fichier user.go pour définir la structure User et la fonction SaveUser pour ajouter un utilisateur au classement.

package db

import (
    "fmt"
    "github.com/go-redis/redis/v8"
)

type User struct {
    Username string `json:"username" binding:"required"`
    Points   int    `json:"points" binding:"required"`
    Rank     int    `json:"rank"`
}

func (db *Database) SaveUser(user *User) error {
    member := &redis.Z{
        Score:  float64(user.Points),
        Member: user.Username,
    }
    pipe := db.Client.TxPipeline()
    pipe.ZAdd(Ctx, "leaderboard", member)
    rank := pipe.ZRank(Ctx, leaderboardKey, user.Username)
    _, err := pipe.Exec(Ctx)
    if err != nil {
        return err
    }
    user.Rank = int(rank.Val())
    return nil
}

Conclusion

Dans cet article, nous avons exploré comment interagir avec une base de données Redis en utilisant la bibliothèque go-redis. Le projet complet est disponible sur GitLab. Pour aller plus loin, consultez la documentation de Redis et go-redis.

N'hésitez pas à tester l'API avec des commandes cURL, Postman, HTTPie ou votre client API préféré. Les commandes cURL de l'exemple sont incluses pour votre référence.

Ce projet offre une base solide pour créer des applications utilisant Redis comme base de données, exploitant les fonctionnalités avancées de go-redis pour une expérience de développement efficace.

Top Articles
Latest Posts
Article information

Author: Prof. Nancy Dach

Last Updated: 12/09/2023

Views: 5993

Rating: 4.7 / 5 (57 voted)

Reviews: 80% of readers found this page helpful

Author information

Name: Prof. Nancy Dach

Birthday: 1993-08-23

Address: 569 Waelchi Ports, South Blainebury, LA 11589

Phone: +9958996486049

Job: Sales Manager

Hobby: Web surfing, Scuba diving, Mountaineering, Writing, Sailing, Dance, Blacksmithing

Introduction: My name is Prof. Nancy Dach, I am a lively, joyous, courageous, lovely, tender, charming, open person who loves writing and wants to share my knowledge and understanding with you.