Golang implémente Redis
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 :
- 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.
- 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.
- Set : le type set est une collection non ordonnée qui contient des chaînes uniques et non répétitives.
- 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.
- 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 :
-
SET : définissez une paire clé-valeur.
set key value
set key value
-
GET:获取指定键的值。
get key
-
INCR:将指定键的值加 1。
incr key
-
DECR:将指定键的值减 1。
decr key
-
EXPIRE:设置键的过期时间。
expire key seconds
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 RedisAfin 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 }
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]) }
func (r *RedisDB) Get(key string) interface{} { result, ok := r.StringData[key] if !ok { return nil } return result }
func (r *RedisDB) Set(key, value string) { r.StringData[key] = value }
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]) // 删除有序集合 } }
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 }
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(" ")) } }
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) }
telnet localhost 6379
set name john OK get name "john" exists name true expire name 60 OK del name OK
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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

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.

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

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.

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 ...

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. � ...

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

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

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, ...
