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.