Skip to content

Redis

Redis est une base de données de stockage clé-valeur (Key-Value) open source, écrite en langage C ANSI, conforme au protocole BSD, prenant en charge le réseau, basée sur la mémoire, distribuée et optionnellement persistante. Elle fournit des API dans plusieurs langages. Redis peut être utilisé comme base de données NoSQL, comme cache haute vitesse, et prend également en charge une file d'attente de messages simple.

Cet article explique uniquement comment utiliser le pilote du langage Go pour opérer la base de données Redis, et ne fournira aucune explication sur Redis lui-même.

Documentation officielle : Golang Redis client (uptrace.dev)

Dépôt officiel : go-redis/redis: Type-safe Redis client for Golang (github.com)

Installation

Il existe plusieurs pilotes pour Redis. Cet article utilise github.com/go-redis/redis.

Si vous utilisez la version 6 de Redis

go get github.com/go-redis/redis/v8

Si vous utilisez la version 7 de Redis

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

Démarrage rapide

go
import (
   "fmt"
   "log"
   "testing"

   "github.com/go-redis/redis"
)

func TestQuickStart(t *testing.T) {
   // Créer un client de connexion Redis
   redisClient := redis.NewClient(&redis.Options{
      Addr:     "192.168.48.134:6379",
      Password: "123456",
      DB:       0, // Utiliser la base de données par défaut
   })

   // Définir une paire clé-valeur, 0 signifie jamais expirer
   redisClient.Set("hello", "world", 0)

   // Lire la valeur
   result, err := redisClient.Get("hello").Result()
   if err == redis.Nil {
      fmt.Println("ket not exist")
   } else if err != nil {
      log.Panic(err)
   }
   fmt.Println(result)
}

Configuration de connexion

go
type Options struct {
  // Type de réseau tcp ou unix.
  // Par défaut tcp.
  Network string
  // Adresse redis, format host:port
  Addr string

    // Dialer crée une nouvelle connexion réseau et a une priorité plus élevée que Network et Addr
  // Network and Addr options.
  Dialer func() (net.Conn, error)

  // Rappelé lors de la création d'une nouvelle connexion redis
  OnConnect func(*Conn) error

  // Mot de passe redis, peut être vide si le serveur redis n'est pas configuré.
  Password string

  // Base de données redis, numérotée à partir de 0, par défaut 0, pas besoin de configurer
  DB int

  // Nombre maximum de tentatives en cas d'échec d'opération redis, par défaut 0.
  MaxRetries int

  // Intervalle minimum entre les tentatives.
  // Par défaut 8ms ; -1 pour désactiver.
  MinRetryBackoff time.Duration

  // Intervalle maximum entre les tentatives
  // Par défaut 512ms ; -1 pour désactiver.
  MaxRetryBackoff time.Duration

  // Délai d'attente pour les nouvelles connexions redis.
  // Par défaut 5 secondes.
  DialTimeout time.Duration

  // Délai de lecture du socket
  // Par défaut 3 secondes.
  ReadTimeout time.Duration

  // Délai d'écriture du socket
  WriteTimeout time.Duration

  // Nombre maximum de connexions dans le pool de connexions redis.
  // Par défaut, la taille du pool est égale au nombre de CPU * 10
  PoolSize int

  // Nombre minimum de connexions inactives dans le pool de connexions redis.
  MinIdleConns int

  // Durée de vie maximum d'une connexion redis, par défaut les connexions obsolètes ne sont pas fermées.
  MaxConnAge time.Duration

  // Lorsque vous récupérez une connexion du pool, le pool attend maximum ce délai.
  // Par défaut ReadTimeout + 1 seconde.
  PoolTimeout time.Duration

  // Fréquence de fermeture des connexions inactives par le pool redis.
  // Par défaut 5 minutes. -1 pour désactiver cette option
  IdleTimeout time.Duration

  // Fréquence de vérification des connexions inactives
  // Par défaut 1 minute. -1 pour désactiver la vérification des connexions inactives
  IdleCheckFrequency time.Duration

  // Paramètre en lecture seule, si true, sur l'instance actuelle, redis ne peut que mettre en cache les requêtes, pas les mises à jour.
  readOnly bool

    // Configuration TLS
  TLSConfig *tls.Config
}

Établir une connexion

go
// Créer un client de connexion Redis
redisClient := redis.NewClient(&redis.Options{
    Addr:     "192.168.48.134:6379",
    Password: "123456",
    DB:       0, // Utiliser la base de données par défaut
})

Fermer la connexion

Le pilote maintient un pool de connexions en interne, il n'est pas nécessaire de fermer la connexion après chaque opération.

go
defer redisClient.Close()

Ce pilote Redis a encapsulé presque toutes les opérations. Les commandes Redis correspondent une à une aux noms de méthodes. Pour utiliser les méthodes correspondantes du pilote, il suffit de savoir comment utiliser les commandes Redis.

Commandes Redis : Manuel des commandes redis

Opérations de base

Supprimer une clé

go
redisClient.Set("name", "jack", 0)
fmt.Println(redisClient.Del("name").Result())

Durée d'expiration

go
redisClient.Set("name", "jack", 0)
// Définir la durée d'expiration
redisClient.Expire("name", time.Second*2)
fmt.Println(redisClient.Get("name").Val())
time.Sleep(time.Second * 3)
fmt.Println(redisClient.Get("name").Val())

Annuler la durée d'expiration

go
redisClient.Set("name", "jack", 2)
// Annuler la durée d'expiration
redisClient.Persist("name")
time.Sleep(time.Second * 2)
fmt.Println(redisClient.Get("name"))

Consulter la durée d'expiration

go
fmt.Println(redisClient.TTL("name"))
fmt.Println(redisClient.PTTL("name"))

Renommer

go
redisClient.Rename("name", "newName")

Consulter le type

go
redisClient.Type("name")

Scanner

go
fmt.Println(redisClient.Scan(0, "", 4))

Chaînes

Lecture et écriture simples

go
redisClient.Set("token", "abcefghijklmn", 0)
fmt.Println(redisClient.Get("token").Val())

Lecture et écriture par lots

go
redisClient.MSet("cookie", "12345", "token", "abcefg")
fmt.Println(redisClient.MGet("cookie", "token").Val())

Incrémenter et décrémenter des nombres

go
redisClient.Set("age", "1", 0)
// Incrémenter
redisClient.Incr("age")
fmt.Println(redisClient.Get("age").Val())
// Décrémenter
redisClient.Decr("age")
fmt.Println(redisClient.Get("age").Val())

Tables de hachage

Opérations de lecture et écriture

go
// Définir un seul champ
redisClient.HSet("map", "name", "jack")
// Définir plusieurs champs
redisClient.HMSet("map", map[string]interface{}{"a": "b", "c": "d", "e": "f"})
// Accéder à un seul champ
fmt.Println(redisClient.HGet("map", "a").Val())
// Accéder à plusieurs champs
fmt.Println(redisClient.HMGet("map", "a", "b").Val())
// Obtenir toute la map
fmt.Println(redisClient.HGetAll("map").Val())

Sortie

b
[b <nil>]
map[a:b c:d e:f name:jack]

Supprimer un champ

go
// Supprimer un champ de la map
redisClient.HDel("map", "a")

Vérifier si un champ existe

go
// Vérifier si un champ existe
redisClient.HExists("map", "a")

Obtenir toutes les clés

go
// Obtenir toutes les clés de la map
redisClient.HKeys("map")

Obtenir la longueur de la table de hachage

go
// Obtenir la longueur de la map
redisClient.HLen("map")

Parcourir les paires clé-valeur de la table de hachage

go
// Parcourir les paires clé-valeur dans la map
redisClient.HScan("map", 0, "", 1)

Listes

Modifier des éléments

go
// Ajouter à gauche
redisClient.LPush("list", "a", "b", "c", "d", "e")
// Ajouter à droite
redisClient.RPush("list", "g", "i", "a")
// Insérer une valeur avant la valeur de référence
redisClient.LInsertBefore("list", "a", "aa")
// Insérer une valeur après la valeur de référence
redisClient.LInsertAfter("list", "a", "gg")
// Définir la valeur de l'élément à l'index spécifié
redisClient.LSet("list", 0, "head")

Accéder à la longueur

go
// Accéder à la longueur de la liste
redisClient.LLen("list")

Accéder aux éléments

go
// Extraire un élément depuis la gauche
redisClient.LPop("list")
// Extraire un élément depuis la droite
redisClient.RPop("list")
// Accéder à l'élément à l'index spécifié
redisClient.LIndex("list", 1)
// Accéder aux éléments dans la plage spécifiée
redisClient.LRange("list", 0, 1)

Supprimer des éléments

go
// Supprimer l'élément spécifié
redisClient.LRem("list", 0, "a")
// Supprimer les éléments dans la plage spécifiée
redisClient.LTrim("list", 0, 1)
// Conserver les éléments dans la plage spécifiée
redisClient.LTrim("list", 0, 1)

Ensembles

Ajouter des éléments

go
// Ajouter des éléments à un ensemble
redisClient.SAdd("set", "a", "b", "c")
redisClient.SAdd("set2", "c", "d", "e")

Accéder aux éléments d'un ensemble

go
// Obtenir tous les membres d'un ensemble
redisClient.SMembers("set")
// Vérifier si un élément appartient à cet ensemble
redisClient.SIsMember("set", "a")
// Retourner count éléments aléatoires
redisClient.SRandMemberN("set", 1)
// Obtenir le nombre d'éléments d'un ensemble
redisClient.SCard("set")

Opérations sur les ensembles

go
// Retourner la différence entre les ensembles donnés
redisClient.SDiff("set", "set2")
// Stocker la différence dans l'ensemble résultat, retourner la taille de l'ensemble résultat
redisClient.SDiffStore("store", "set", "se2")
// Retourner l'intersection des ensembles donnés
redisClient.SInter("set", "set2")
// Stocker l'intersection dans l'ensemble résultat, retourner la taille de l'ensemble résultat
redisClient.SInterStore("store", "set", "set2")
// Retourner l'union des ensembles donnés
redisClient.SUnion("set", "set2")
// Stocker l'union dans l'ensemble résultat, retourner la taille de l'ensemble résultat
redisClient.SUnionStore("store", "set", "store")

Supprimer des éléments

go
// Extraire et supprimer l'élément
redisClient.SPop("set")
// Extraire et supprimer N éléments
redisClient.SPopN("set", 2)

Déplacer un élément

go
// Déplacer l'élément spécifié de l'ensemble source vers l'ensemble cible
redisClient.SMove("set", "set2", "a")

Supprimer des éléments

go
// Supprimer les éléments spécifiés
redisClient.SRem("set", "a", "b")

Parcourir

go
// Parcourir l'ensemble
redisClient.SScan("set", 0, "", 2)

Ensembles ordonnés

Ajouter des éléments

go
// Ajouter des éléments à un ensemble ordonné
redisClient.ZAdd("ss", redis.Z{
   Score:  1,
   Member: "a",
}, redis.Z{
   Score:  2,
   Member: "b",
})

Classement des éléments

go
// Retourner le rang de l'élément dans l'ensemble ordonné, classé du plus bas au plus haut
redisClient.ZRank("ss", "1")
// Retourner le rang de l'élément dans l'ensemble ordonné, classé du plus haut au plus bas
redisClient.ZRevRank("ss", "1")

Accéder aux éléments

go
// Retourner le nombre de membres entre min et max
redisClient.ZCount("ss", "1", "2")

// Retourner le score de l'élément
redisClient.ZScore("ss", "a")

// Retourner les éléments dans la plage spécifiée
redisClient.ZRange("ss", 1, 2)
// Retourner la liste de tous les membres entre min et max
redisClient.ZRangeByScore("ss", redis.ZRangeBy{
   Min:    "1",
   Max:    "2",
   Offset: 0,
   Count:  1,
})

Modifier le score

go
// Augmenter le score correspondant d'un élément
redisClient.ZIncr("ss", redis.Z{
   Score:  2,
   Member: "b",
})

Supprimer des éléments

go
// Supprimer l'élément spécifié
redisClient.ZRem("ss", "a")
// Supprimer les éléments dans la plage de rangs spécifiée
redisClient.ZRemRangeByRank("ss", 1, 2)
// Supprimer les éléments dont le score est entre min et max
redisClient.ZRemRangeByScore("ss", "1", "2")

Scripts

go
// Charger un script, retourner la valeur sha
redisClient.ScriptLoad("return 0")
// Exécuter un script selon la valeur sha
redisClient.EvalSha("sha", []string{}, "")
// Exécuter directement un script
redisClient.Eval("return 0", []string{}, "")
// Vider le cache des scripts
redisClient.ScriptFlush()
// Tuer le script en cours d'exécution
redisClient.ScriptKill()
// Vérifier si le script avec le hash correspondant existe
redisClient.ScriptExists("")

Publication et abonnement

go
// Envoyer un message sur le canal spécifié
redisClient.Publish("channel", "message")
// S'abonner au canal spécifié
redisClient.Subscribe("channel")
// Voir l'état des abonnements
redisClient.PubSubNumSub("channel")

Golang by www.golangdev.cn edit