Table des matières
Contenu de la question
Solution
Partie conceptuelle
Commerce
Verrouiller le stockage kv
Encodage
Maison développement back-end Golang Comment les clés du KV Store sont-elles verrouillées ?

Comment les clés du KV Store sont-elles verrouillées ?

Feb 09, 2024 pm 01:20 PM
并发访问

KV Store 中的密钥是如何锁定的?

L'éditeur php Zimo vous révélera le secret du verrouillage par clé dans KV Store. Dans KV Store, le verrouillage des clés est réalisé grâce à une série d'algorithmes et de technologies complexes. Tout d'abord, le système génère un identifiant unique pour chaque clé et le stocke avec la valeur correspondante dans la base de données. Dans le même temps, le système utilisera également une fonction de hachage pour chiffrer la clé afin d'assurer sa sécurité. De plus, le système utilise également des listes de contrôle d'accès (ACL) pour restreindre l'accès aux clés afin que seuls les utilisateurs autorisés puissent effectuer des opérations de lecture et d'écriture. Grâce à ces mesures de sécurité, KV Store garantit la sécurité et la fiabilité des clés et fournit aux utilisateurs des services de stockage de données sûrs et fiables.

Contenu de la question

Je construis un magasin kv distribué juste pour en savoir plus sur les systèmes distribués et la concurrence. La mise en œuvre du stockage kv que je construis est entièrement transactionnelle, avec un journal des transactions en mémoire. Pour simplifier les choses, le stockage est également entièrement en mémoire. L'API est publique getinsertupdateremove. Notez que tous les points de terminaison fonctionnent sur une seule clé, et non sur une plage de clés.

Je gère la concurrence via des verrous. Cependant, j'ai un verrou global qui verrouille l'intégralité du magasin de données. Cela semble très inefficace, car si je veux mettre à jour la valeur de k2 时读取 k1 , je dois attendre que k2 termine la mise à jour, même si cela n'a pas d'importance.

Je sais que certaines bases de données utilisent un verrouillage plus fin. Par exemple, sur le serveur MySQL, il existe des verrous au niveau des lignes. Comment implémenter le verrouillage au niveau des clés ?

J'ai

type storage struct {
  store map[string]int32
}
Copier après la connexion

Dois-je ajouter quelque chose comme ça ? :

type Storage struct {
  store map[string]int32
  locks map[string]mutex.Lock
}
Copier après la connexion

Si je fais cela, le problème est que locks 必须与 store 保持同步。另一种选择是合并两个映射,但即便如此,如果 remove 请求出现在 getavant, j'avais aussi le problème de supprimer les entrées dans la carte verrouillée.

Solution

Partie conceptuelle

Commerce

Tout d’abord, une forte cohérence ne nécessite pas de journaux de transactions. Les journaux de transactions sont utiles pour conserver les propriétés acides.

Les transactions ne constituent pas non plus une exigence stricte pour une forte cohérence dans une base de données, mais elles peuvent être un outil utile pour garantir la cohérence dans de nombreuses situations.

Une cohérence forte fait référence à la propriété qui garantit que toutes les lectures de la base de données renverront l'écriture la plus récente, quel que soit l'endroit où l'opération de lecture est effectuée. En d’autres termes, une forte cohérence garantit que tous les clients verront les mêmes données et que les données seront à jour et cohérentes dans l’ensemble du système.

Vous pouvez utiliser des algorithmes de consensus tels que paxos ou raft pour garantir une forte cohérence. Lors du stockage de données, vous pouvez stocker une version des données et l'utiliser comme identifiant dans paxos.

Verrouiller le stockage kv

Dans un magasin clé-valeur (kv), les clés sont généralement verrouillées à l'aide d'une sorte de mécanisme de verrouillage, tel qu'un mutex ou un verrou lecteur-écrivain (comme @paulsm4 l'a suggéré). Cela permet à plusieurs threads ou processus d'accéder et de modifier simultanément les données dans le magasin kv tout en garantissant que les données restent cohérentes et correctes.

Par exemple, lorsqu'un thread ou un processus souhaite lire ou modifier une clé spécifique dans le magasin kv, il peut acquérir un verrou sur cette clé. Cela empêche d'autres threads ou processus de modifier la même clé en même temps, provoquant des conditions de concurrence critique et d'autres problèmes. Une fois qu'un thread ou un processus a fini de lire ou de modifier la clé, le verrou peut être libéré, permettant à d'autres threads ou processus d'accéder à la clé.

Les détails spécifiques sur la façon de verrouiller les clés dans le stockage kv peuvent varier en fonction de la mise en œuvre du stockage kv. Certains magasins kv peuvent utiliser des verrous globaux (comme vous le faites déjà, ce qui est parfois inefficace) pour verrouiller l'intégralité du magasin de données, tandis que d'autres magasins kv peuvent utiliser des mécanismes de verrouillage plus fins tels que des verrous au niveau des lignes ou des verrous au niveau des clés pour permettre plus d'opérations. Accès simultané aux données.

Donc, tldr ; conceptuellement, vous avez raison. Le problème réside dans les détails d’implémentation du verrouillage.

Encodage

Pour répondre strictement à votre question sur le verrouillage, pensez à Reader Lock comme @paulsm4 l'a suggéré. En Golang, un verrou similaire est rwmutexrwmutex。它用于 sync。 map. Il est utilisé pour la sync. carte.

Voici un court exemple :

type Storage struct {
  store sync.Map // a concurrent map
}

// GET retrieves the value for the given key.
func (s *Storage) GET(key string) (int32, error) {
  // Acquire a read lock for the key.
  v, ok := s.store.Load(key)
  if !ok {
    return 0, fmt.Errorf("key not found: %s", key)
  }

  // Return the value.
  return v.(int32), nil
}

// INSERT inserts the given key-value pair into the data store.
func (s *Storage) INSERT(key string, value int32) error {
  // Acquire a write lock for the key.
  s.store.Store(key, value)
  return nil
}

// UPDATE updates the value for the given key.
func (s *Storage) UPDATE(key string, value int32) error {
  // Acquire a write lock for the key.
  s.store.Store(key, value)
  return nil
}

// REMOVE removes the key-value pair for the given key from the data store.
func (s *Storage) REMOVE(key string) error {
  // Acquire a write lock for the key.
  s.store.Delete(key)
  return nil
}
Copier après la connexion

En plus de cela, vous avez besoin de paxos pour assurer la cohérence entre les répliques.

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)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Où trouver la courte de la grue à atomide atomique
1 Il y a quelques semaines By DDD

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)

Comment garantir la sécurité des threads des variables volatiles dans les fonctions Java ? Comment garantir la sécurité des threads des variables volatiles dans les fonctions Java ? May 04, 2024 am 10:15 AM

Méthodes pour garantir la sécurité des threads des variables volatiles en Java : Visibilité : assurez-vous que les modifications apportées aux variables volatiles par un thread sont immédiatement visibles par les autres threads. Atomicité : assurez-vous que certaines opérations sur des variables volatiles (telles que les échanges d'écriture, de lecture et de comparaison) sont indivisibles et ne seront pas interrompues par d'autres threads.

À quels pièges devons-nous prêter attention lors de la conception de systèmes distribués avec la technologie Golang ? À quels pièges devons-nous prêter attention lors de la conception de systèmes distribués avec la technologie Golang ? May 07, 2024 pm 12:39 PM

Pièges du langage Go lors de la conception de systèmes distribués Go est un langage populaire utilisé pour développer des systèmes distribués. Cependant, il existe certains pièges à prendre en compte lors de l'utilisation de Go qui peuvent nuire à la robustesse, aux performances et à l'exactitude de votre système. Cet article explorera quelques pièges courants et fournira des exemples pratiques sur la façon de les éviter. 1. Surutilisation de la concurrence Go est un langage de concurrence qui encourage les développeurs à utiliser des goroutines pour augmenter le parallélisme. Cependant, une utilisation excessive de la concurrence peut entraîner une instabilité du système, car trop de goroutines se disputent les ressources et entraînent une surcharge de changement de contexte. Cas pratique : une utilisation excessive de la concurrence entraîne des retards de réponse des services et une concurrence entre les ressources, qui se manifestent par une utilisation élevée du processeur et une surcharge importante de garbage collection.

Un guide pour les tests unitaires des fonctions simultanées Go Un guide pour les tests unitaires des fonctions simultanées Go May 03, 2024 am 10:54 AM

Les tests unitaires des fonctions simultanées sont essentiels car cela permet de garantir leur comportement correct dans un environnement simultané. Des principes fondamentaux tels que l'exclusion mutuelle, la synchronisation et l'isolement doivent être pris en compte lors du test de fonctions concurrentes. Les fonctions simultanées peuvent être testées unitairement en simulant, en testant les conditions de concurrence et en vérifiant les résultats.

Comment résoudre le problème des serveurs occupés pour Deepseek Comment résoudre le problème des serveurs occupés pour Deepseek Mar 12, 2025 pm 01:39 PM

Deepseek: Comment gérer l'IA populaire qui est encombré de serveurs? En tant qu'IA chaude en 2025, Deepseek est gratuit et open source et a une performance comparable à la version officielle d'Openaio1, qui montre sa popularité. Cependant, une concurrence élevée apporte également le problème de l'agitation du serveur. Cet article analysera les raisons et fournira des stratégies d'adaptation. Entrée de la version Web Deepseek: https://www.deepseek.com/deepseek serveur Raison: Accès simultané: des fonctionnalités gratuites et puissantes de Deepseek attirent un grand nombre d'utilisateurs à utiliser en même temps, ce qui entraîne une charge de serveur excessive. Cyber ​​Attack: Il est rapporté que Deepseek a un impact sur l'industrie financière américaine.

Mécanisme de verrouillage et de synchronisation des fonctions C++ en programmation concurrente ? Mécanisme de verrouillage et de synchronisation des fonctions C++ en programmation concurrente ? Apr 27, 2024 am 11:21 AM

Les verrous de fonction et les mécanismes de synchronisation dans la programmation simultanée C++ sont utilisés pour gérer l'accès simultané aux données dans un environnement multithread et empêcher la concurrence des données. Les principaux mécanismes incluent : Mutex (Mutex) : une primitive de synchronisation de bas niveau qui garantit qu'un seul thread accède à la section critique à la fois. Variable de condition (ConditionVariable) : permet aux threads d'attendre que les conditions soient remplies et assure la communication entre les threads. Opération atomique : opération à instruction unique, garantissant une mise à jour monothread des variables ou des données pour éviter les conflits.

Comment retourner le pointeur dans Golang ? Comment retourner le pointeur dans Golang ? Apr 23, 2024 pm 02:09 PM

Le retour des pointeurs dans Go permet un accès direct aux données brutes. La syntaxe pour renvoyer un pointeur consiste à utiliser un type préfixé par un astérisque, par exemple : funcgetPointer()int{varxint=10;return&x}. Les pointeurs peuvent être utilisés pour allouer dynamiquement des données, en utilisant la nouvelle fonction et en déréférençant le pointeur pour définir la valeur. Les pointeurs de retour doivent prêter attention à la sécurité de la concurrence, à l'alias et à l'applicabilité.

Comment implémenter des structures de données sans verrouillage dans la programmation simultanée Java ? Comment implémenter des structures de données sans verrouillage dans la programmation simultanée Java ? May 02, 2024 am 10:21 AM

Structures de données sans verrouillage dans la programmation simultanée Java Dans la programmation simultanée, les structures de données sans verrouillage sont cruciales, permettant à plusieurs threads d'accéder et de modifier simultanément les mêmes données sans acquérir de verrous. Cela améliore considérablement les performances et le débit des applications. Cet article présentera les structures de données sans verrouillage couramment utilisées et leur implémentation en Java. L'opération CAS Compare-and-Swap (CAS) est au cœur des structures de données sans verrouillage. Il s'agit d'une opération atomique qui met à jour une variable en comparant la valeur actuelle avec la valeur attendue. Si la valeur de la variable est égale à la valeur attendue, la mise à jour réussit ; sinon, la mise à jour échoue. File d'attente sans verrouillage ConcurrentLinkedQueue est une file d'attente sans verrouillage, implémentée à l'aide d'une structure basée sur une liste chaînée. Il permet une insertion et une suppression efficaces

Comment utiliser les classes atomiques dans la concurrence des fonctions Java et le multithreading ? Comment utiliser les classes atomiques dans la concurrence des fonctions Java et le multithreading ? Apr 28, 2024 pm 04:12 PM

Les classes atomiques sont des classes thread-safe en Java qui fournissent des opérations ininterrompues et sont cruciales pour garantir l'intégrité des données dans des environnements concurrents. Java fournit les classes atomiques suivantes : AtomicIntegerAtomicLongAtomicReferenceAtomicBoolean Ces classes fournissent des méthodes pour obtenir, définir et comparer des valeurs afin de garantir que l'opération est atomique et ne sera pas interrompue par des threads. Les classes atomiques sont utiles lorsque vous travaillez avec des données partagées et évitez la corruption des données, comme la gestion de compteurs partagés pour les accès simultanés.

See all articles