Maison développement back-end Golang Golang implémente Redis

Golang implémente Redis

May 22, 2023 pm 05:12 PM

Redis est une base de données de stockage clé-valeur hautes performances qui est très populaire et largement utilisée dans la mise en cache, les files d'attente de messages, le stockage de données et d'autres scénarios. Cet article explique comment utiliser le langage Go pour implémenter une simple base de données Redis.

Structure de données Redis

Redis est une base de données de stockage clé-valeur, où les clés et les valeurs peuvent être de différents types de données. Redis prend en charge cinq types de données de base :

  1. String : le type de données le plus élémentaire de Redis est sécurisé en mode binaire, ce qui signifie qu'il peut contenir n'importe quelle donnée. La longueur maximale des données de ce type est de 512 Mo.
  2. List (List) : Le type de liste est une liste doublement chaînée. Chaque nœud contient une chaîne, permettant des opérations telles que suspendre, déplacer et faire apparaître aux deux extrémités de la liste.
  3. Set : le type set est une collection non ordonnée qui contient des chaînes uniques et non répétitives.
  4. Table de hachage (Hash) : Le type de table de hachage est une table de hachage non ordonnée avec des champs de chaîne et les valeurs correspondantes. Les champs de chaîne sont uniques et utilisés pour stocker des paires clé-valeur.
  5. Ensemble ordonné (ZSet) : le type d'ensemble ordonné est un ensemble non ordonné classé contenant des membres uniques et non dupliqués et un score ordonné associé à chaque membre.

Parmi les types de données ci-dessus, les chaînes, les listes, les tables de hachage et les ensembles ordonnés sont les types les plus couramment utilisés.

Différent des autres bases de données, Redis utilise un modèle monothread pour des raisons de performances et utilise une grande quantité de mémoire, ce qui nécessite d'écrire fréquemment les données sur le disque.

Commandes Redis

Les commandes Redis (Commandes) sont des messages envoyés par le client au serveur Redis. Elles sont généralement au format texte brut et utilisent
comme délimiteur entre les commandes et les paramètres. Chaque commande se compose d'un ou plusieurs paramètres, dont le premier est le nom de la commande. Les commandes Redis peuvent être utilisées pour exploiter les données de la base de données Redis, telles que la lecture et l'écriture de données, la création et la suppression de clés, etc.

Voici des exemples de plusieurs commandes couramment utilisées :

  1. SET : définissez une paire clé-valeur.

    set key valueset key value

  2. GET:获取指定键的值。

    get key

  3. INCR:将指定键的值加 1。

    incr key

  4. DECR:将指定键的值减 1。

    decr key

  5. EXPIRE:设置键的过期时间。

    expire key seconds

GET : Obtenez la valeur de la clé spécifiée.

get key

INCR : Augmente la valeur de la clé spécifiée de 1.

incr key

DECR : Décrémenter la valeur de la clé spécifiée de 1.

decr key

EXPIRE : Définissez le délai d'expiration de la clé.

expire les secondes clés

Implémentation de la base de données Redis

Afin d'implémenter la base de données Redis, nous devons créer cinq types de structures de données : chaînes, listes, ensembles, tables de hachage et ensembles ordonnés. Nous devons également implémenter le serveur Redis afin qu'il puisse accepter les commandes client et les traiter.

Tout d'abord, nous devons définir une structure de base de données Redis, qui peut stocker toutes les paires clé-valeur et contient cinq types de structures de données :

type RedisDB struct {
   StringData map[string]string
   ListData map[string][]string
   SetData map[string]map[string]bool
   HashData map[string]map[string]string
   ZsetData map[string]map[string]float64
}
Copier après la connexion

Ensuite, nous définissons la méthode de traitement des commandes Redis. Nous pouvons utiliser l'instruction switch pour écrire une instruction case pour chaque nom de commande, puis l'envoyer à la méthode correspondante en fonction du nom de la commande et des paramètres, par exemple : 🎜
func (r *RedisDB) ExecuteCommand(command []string) interface{} {
   switch strings.ToLower(command[0]) {
   case "get":
      return r.Get(command[1])
   case "set":
      r.Set(command[1], command[2])
      return "OK"
   case "del":
      r.Del(command[1:]...)
      return "OK"
   case "exists":
      return r.Exists(command[1])
   case "expire":
      r.Expire(command[1], command[2])
      return "OK"
   }
   return fmt.Sprintf("Error: unknown command %s", command[0])
}
Copier après la connexion
🎜 Nous devons implémenter une méthode pour gérer chaque commande Redis. Par exemple, voici l'implémentation de la commande GET : 🎜
func (r *RedisDB) Get(key string) interface{} {
   result, ok := r.StringData[key]
   if !ok {
      return nil
   }
   return result
}
Copier après la connexion
🎜 L'implémentation de la commande SET est la suivante : 🎜
func (r *RedisDB) Set(key, value string) {
   r.StringData[key] = value
}
Copier après la connexion
🎜 L'implémentation de la commande DEL est la suivante : 🎜
func (r *RedisDB) Del(keys ...string) {
   for i := range keys {
      delete(r.StringData, keys[i]) // 删除字符串
      delete(r.ListData, keys[i])   // 删除列表
      delete(r.SetData, keys[i])    // 删除集合
      delete(r.HashData, keys[i])   // 删除哈希表
      delete(r.ZsetData, keys[i])   // 删除有序集合
   }
}
Copier après la connexion
🎜La commande EXISTS est la suivante : 🎜
func (r *RedisDB) Exists(key string) interface{} {
   _, ok1 := r.StringData[key]
   _, ok2 := r.ListData[key]
   _, ok3 := r.SetData[key]
   _, ok4 := r.HashData[key]
   _, ok5 := r.ZsetData[key]
   if ok1 || ok2 || ok3 || ok4 || ok5 {
      return true
   }
   return false
}
Copier après la connexion
🎜Enfin, nous en avons implémenté un simple pour la base de données Redis. Un analyseur de commandes qui reçoit les commandes du client et les transmet aux méthodes de traitement des commandes de la base de données pour obtenir un résultat. Le code est le suivant : 🎜
func (r *RedisDB) CommandParser(conn net.Conn) {
   defer conn.Close()
   reader := bufio.NewReader(conn)
   for {
      command, err := reader.ReadString('
')
      if err != nil {
         return
      }
      command = strings.TrimRight(command, "
")
      if len(command) == 0 {
         continue
      }

      args := strings.Split(command, " ")
      result := r.ExecuteCommand(args)
      data, _ := json.Marshal(result)
      conn.Write(data)
      conn.Write([]byte("
"))
   }
}
Copier après la connexion
🎜De cette façon, nous avons implémenté une simple base de données Redis. 🎜🎜Testez la base de données Redis🎜🎜Nous pouvons utiliser telnet pour tester la base de données Redis. Tout d'abord, exécutez le serveur Redis : 🎜
redis := RedisDB{
   StringData: make(map[string]string),
   ListData: make(map[string][]string),
   SetData: make(map[string]map[string]bool),
   HashData: make(map[string]map[string]string),
   ZsetData: make(map[string]map[string]float64),
}
listener, err := net.Listen("tcp", ":6379")
if err != nil {
   log.Fatal("Unable to listen on port 6379", err)
}
for {
   conn, err := listener.Accept()
   if err != nil {
      log.Println("Error accepting connection", err)
      continue
   }
   go redis.CommandParser(conn)
}
Copier après la connexion
🎜 Ensuite, utilisez telnet pour vous connecter au serveur Redis : 🎜
telnet localhost 6379
Copier après la connexion
🎜Entrez la commande dans telnet pour tester la base de données Redis : 🎜
set name john
OK
get name
"john"
exists name
true
expire name 60
OK
del name
OK
Copier après la connexion
🎜De cette façon, nous avons réussi à implémenter une base de données Redis simple. . Bien sûr, il ne s'agit que d'une implémentation de base, et la base de données Redis actuelle contient également de nombreuses fonctionnalités avancées, telles que la publication/abonnement, les scripts Lua, les transactions, la persistance, le clustering, etc. Mais la version simple fournie dans cet article est suffisante pour que vous compreniez les principes de base de mise en œuvre de Redis. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Vous avez un jeu croisé?
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quelles sont les vulnérabilités de Debian OpenSSL Quelles sont les vulnérabilités de Debian OpenSSL Apr 02, 2025 am 07:30 AM

OpenSSL, en tant que bibliothèque open source largement utilisée dans les communications sécurisées, fournit des algorithmes de chiffrement, des clés et des fonctions de gestion des certificats. Cependant, il existe des vulnérabilités de sécurité connues dans sa version historique, dont certaines sont extrêmement nocives. Cet article se concentrera sur les vulnérabilités et les mesures de réponse communes pour OpenSSL dans Debian Systems. DebianopenSSL CONNUTS Vulnérabilités: OpenSSL a connu plusieurs vulnérabilités graves, telles que: la vulnérabilité des saignements cardiaques (CVE-2014-0160): cette vulnérabilité affecte OpenSSL 1.0.1 à 1.0.1F et 1.0.2 à 1.0.2 Versions bêta. Un attaquant peut utiliser cette vulnérabilité à des informations sensibles en lecture non autorisées sur le serveur, y compris les clés de chiffrement, etc.

Comment utilisez-vous l'outil PPROF pour analyser les performances GO? Comment utilisez-vous l'outil PPROF pour analyser les performances GO? Mar 21, 2025 pm 06:37 PM

L'article explique comment utiliser l'outil PPROF pour analyser les performances GO, notamment l'activation du profilage, la collecte de données et l'identification des goulots d'étranglement communs comme le processeur et les problèmes de mémoire. COMMANDE: 159

Comment rédigez-vous des tests unitaires en Go? Comment rédigez-vous des tests unitaires en Go? Mar 21, 2025 pm 06:34 PM

L'article traite des tests d'unité d'écriture dans GO, couvrant les meilleures pratiques, des techniques de moquerie et des outils pour une gestion efficace des tests.

Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Apr 02, 2025 pm 02:06 PM

La bibliothèque utilisée pour le fonctionnement du numéro de point flottante dans le langage go présente comment s'assurer que la précision est ...

Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Apr 02, 2025 pm 02:09 PM

Problème de threading de file d'attente dans Go Crawler Colly explore le problème de l'utilisation de la bibliothèque Crawler Crawler dans le langage Go, les développeurs rencontrent souvent des problèmes avec les threads et les files d'attente de demande. � ...

Quelle est la commande Go FMT et pourquoi est-elle importante? Quelle est la commande Go FMT et pourquoi est-elle importante? Mar 20, 2025 pm 04:21 PM

L'article traite de la commande GO FMT dans GO Programming, qui formate le code pour adhérer aux directives de style officiel. Il met en évidence l'importance de GO FMT pour maintenir la cohérence du code, la lisibilité et la réduction des débats de style. Meilleures pratiques pour

Méthode de surveillance postgresql sous Debian Méthode de surveillance postgresql sous Debian Apr 02, 2025 am 07:27 AM

Cet article présente une variété de méthodes et d'outils pour surveiller les bases de données PostgreSQL sous le système Debian, vous aidant à saisir pleinement la surveillance des performances de la base de données. 1. Utilisez PostgreSQL pour reprendre la surveillance Afficher PostgreSQL lui-même offre plusieurs vues pour surveiller les activités de la base de données: PG_STAT_ACTIVITY: affiche les activités de la base de données en temps réel, y compris les connexions, les requêtes, les transactions et autres informations. PG_STAT_REPLIcation: surveille l'état de réplication, en particulier adapté aux grappes de réplication de flux. PG_STAT_DATABASE: Fournit des statistiques de base de données, telles que la taille de la base de données, les temps de validation / recul des transactions et d'autres indicateurs clés. 2. Utilisez l'outil d'analyse de journaux pgbadg

Transformant du développement frontal au développement back-end, est-il plus prometteur d'apprendre Java ou Golang? Transformant du développement frontal au développement back-end, est-il plus prometteur d'apprendre Java ou Golang? Apr 02, 2025 am 09:12 AM

Chemin d'apprentissage du backend: le parcours d'exploration du front-end à l'arrière-end en tant que débutant back-end qui se transforme du développement frontal, vous avez déjà la base de Nodejs, ...

See all articles