Inhaltsverzeichnis
Frageninhalt
Lösung
Konzeptteil
Handel
KV-Speicher sperren
Kodierung
Heim Backend-Entwicklung Golang Wie werden die Schlüssel im KV Store verschlossen?

Wie werden die Schlüssel im KV Store verschlossen?

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

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

php-Editor Zimo verrät Ihnen das Geheimnis der Schlüsselverriegelung im KV Store. Im KV Store wird die Schlüsselsperre durch eine Reihe komplexer Algorithmen und Technologien erreicht. Zunächst generiert das System für jeden Schlüssel eine eindeutige Kennung und speichert diese mit dem entsprechenden Wert in der Datenbank. Gleichzeitig verwendet das System auch eine Hash-Funktion, um den Schlüssel zu verschlüsseln, um seine Sicherheit zu gewährleisten. Darüber hinaus verwendet das System auch Zugriffskontrolllisten (ACLs), um den Zugriff auf Schlüssel einzuschränken, sodass nur autorisierte Benutzer Lese- und Schreibvorgänge ausführen können. Durch diese Sicherheitsmaßnahmen gewährleistet KV Store die Sicherheit und Zuverlässigkeit der Schlüssel und bietet Benutzern sichere und zuverlässige Datenspeicherdienste.

Frageninhalt

Ich baue einen verteilten KV-Store auf, nur um mehr über verteilte Systeme und Parallelität zu erfahren. Die von mir erstellte Implementierung des KV-Speichers ist vollständig transaktional und verfügt über ein In-Memory-Transaktionsprotokoll. Der Einfachheit halber erfolgt die Speicherung auch vollständig im Arbeitsspeicher. Die API ist öffentlich getinsertupdateremove. Beachten Sie, dass alle Endpunkte mit einem einzigen Schlüssel arbeiten, nicht mit einer Reihe von Schlüsseln.

Ich verwalte Parallelität über Sperren. Allerdings habe ich eine globale Sperre, die den gesamten Datenspeicher sperrt. Das klingt sehr ineffizient, denn wenn ich den Wert von k2 时读取 k1 aktualisieren möchte, muss ich warten, bis k2 die Aktualisierung abgeschlossen hat, obwohl das irrelevant ist.

Ich weiß, dass einige Datenbanken eine feinkörnigere Sperrung verwenden. Beispielsweise gibt es auf dem MySQL-Server Sperren auf Zeilenebene. Wie implementiert man eine Sperrung auf Schlüsselebene?

Ich habe

type storage struct {
  store map[string]int32
}
Nach dem Login kopieren

Soll ich so etwas hinzufügen? :

type Storage struct {
  store map[string]int32
  locks map[string]mutex.Lock
}
Nach dem Login kopieren

Wenn ich das mache, besteht das Problem darin, dass locks 必须与 store 保持同步。另一种选择是合并两个映射,但即便如此,如果 remove 请求出现在 get ich vorher auch das Problem hatte, Einträge in der Karte zu löschen bei Sperre.

Lösung

Konzeptteil

Handel

Erstens erfordert eine starke Konsistenz keine Transaktionsprotokolle. Transaktionsprotokolle sind nützlich, um Säureeigenschaften aufrechtzuerhalten.

Transaktionen sind auch keine zwingende Voraussetzung für eine starke Konsistenz in einer Datenbank, können aber in vielen Situationen ein nützliches Werkzeug zur Gewährleistung der Konsistenz sein.

Starke Konsistenz bezieht sich auf die Eigenschaft, die sicherstellt, dass alle Lesevorgänge aus der Datenbank den neuesten Schreibvorgang zurückgeben, unabhängig davon, wo der Lesevorgang ausgeführt wird. Mit anderen Worten: Eine starke Konsistenz garantiert, dass alle Clients die gleichen Daten sehen und dass die Daten im gesamten System aktuell und konsistent sind.

Sie können Konsensalgorithmen wie Paxos oder Raft verwenden, um eine starke Konsistenz sicherzustellen. Beim Speichern von Daten können Sie eine Version der Daten speichern und diese als ID in Paxos verwenden.

KV-Speicher sperren

In einem Schlüsselwertspeicher (kv) werden Schlüssel normalerweise mit einer Art Sperrmechanismus gesperrt, z. B. einer Mutex- oder Leser-Schreiber-Sperre (wie von @paulsm4 vorgeschlagen). Dadurch können mehrere Threads oder Prozesse gleichzeitig auf Daten im KV-Speicher zugreifen und diese ändern, während gleichzeitig sichergestellt wird, dass die Daten konsistent und korrekt bleiben.

Wenn beispielsweise ein Thread oder Prozess einen bestimmten Schlüssel im KV-Speicher lesen oder ändern möchte, kann er eine Sperre für diesen Schlüssel erhalten. Dadurch wird verhindert, dass andere Threads oder Prozesse gleichzeitig denselben Schlüssel ändern, was zu Race Conditions und anderen Problemen führen kann. Sobald ein Thread oder Prozess das Lesen oder Ändern des Schlüssels abgeschlossen hat, kann die Sperre aufgehoben werden, sodass andere Threads oder Prozesse auf den Schlüssel zugreifen können.

Die spezifischen Details zum Sperren von Schlüsseln im KV-Speicher können je nach Implementierung des KV-Speichers variieren. Einige KV-Speicher verwenden möglicherweise globale Sperren (wie Sie es bereits tun, was manchmal ineffizient ist), um den gesamten Datenspeicher zu sperren, während andere KV-Speicher möglicherweise detailliertere Sperrmechanismen wie Sperren auf Zeilenebene oder Sperren auf Schlüsselebene verwenden mehr Operationen ermöglichen. Gleichzeitiger Zugriff auf Daten.

Also, tldr; konzeptionell hast du recht. Das Problem liegt in den Implementierungsdetails des Sperrens.

Kodierung

Um die Frage zum Sperren genau zu beantworten, ziehen Sie die Reader-Sperre in Betracht, wie von @paulsm4 vorgeschlagen. In Golang ist eine ähnliche Sperre rwmutexrwmutex。它用于 sync。 map. Es wird für die Synchronisierung verwendet. Karte.

Hier ein kurzes Beispiel:

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
}
Nach dem Login kopieren

Darüber hinaus benötigen Sie Paxos, um die Konsistenz zwischen den Replikaten sicherzustellen.

Das obige ist der detaillierte Inhalt vonWie werden die Schlüssel im KV Store verschlossen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie kann die Thread-Sicherheit flüchtiger Variablen in Java-Funktionen sichergestellt werden? Wie kann die Thread-Sicherheit flüchtiger Variablen in Java-Funktionen sichergestellt werden? May 04, 2024 am 10:15 AM

Methoden zur Gewährleistung der Thread-Sicherheit flüchtiger Variablen in Java: Sichtbarkeit: Stellen Sie sicher, dass Änderungen an flüchtigen Variablen durch einen Thread für andere Threads sofort sichtbar sind. Atomarität: Stellen Sie sicher, dass bestimmte Vorgänge an flüchtigen Variablen (z. B. Schreiben, Lesen und Vergleichsaustausch) unteilbar sind und nicht durch andere Threads unterbrochen werden.

Auf welche Fallstricke sollten wir beim Entwurf verteilter Systeme mit Golang-Technologie achten? Auf welche Fallstricke sollten wir beim Entwurf verteilter Systeme mit Golang-Technologie achten? May 07, 2024 pm 12:39 PM

Fallstricke in der Go-Sprache beim Entwurf verteilter Systeme Go ist eine beliebte Sprache für die Entwicklung verteilter Systeme. Allerdings gibt es bei der Verwendung von Go einige Fallstricke zu beachten, die die Robustheit, Leistung und Korrektheit Ihres Systems beeinträchtigen können. In diesem Artikel werden einige häufige Fallstricke untersucht und praktische Beispiele für deren Vermeidung gegeben. 1. Übermäßiger Gebrauch von Parallelität Go ist eine Parallelitätssprache, die Entwickler dazu ermutigt, Goroutinen zu verwenden, um die Parallelität zu erhöhen. Eine übermäßige Nutzung von Parallelität kann jedoch zu Systeminstabilität führen, da zu viele Goroutinen um Ressourcen konkurrieren und einen Mehraufwand beim Kontextwechsel verursachen. Praktischer Fall: Übermäßiger Einsatz von Parallelität führt zu Verzögerungen bei der Dienstantwort und Ressourcenkonkurrenz, was sich in einer hohen CPU-Auslastung und einem hohen Aufwand für die Speicherbereinigung äußert.

So lösen Sie das Problem vielbeschäftigter Server für Deepseek So lösen Sie das Problem vielbeschäftigter Server für Deepseek Mar 12, 2025 pm 01:39 PM

Deepseek: Wie kann man mit der beliebten KI umgehen, die von Servern überlastet ist? Als heiße KI im Jahr 2025 ist Deepseek frei und Open Source und hat eine Leistung, die mit der offiziellen Version von OpenAio1 vergleichbar ist, die seine Popularität zeigt. Eine hohe Parallelität bringt jedoch auch das Problem der Serververantwortung. Dieser Artikel wird die Gründe analysieren und Bewältigungsstrategien bereitstellen. Eingang der Deepseek -Webversion: https://www.deepseek.com/deepseek Server Beschäftigter Grund: Hoher Zugriff: Deepseeks kostenlose und leistungsstarke Funktionen ziehen eine große Anzahl von Benutzern an, die gleichzeitig verwendet werden können, was zu einer übermäßigen Last von Server führt. Cyber ​​-Angriff: Es wird berichtet, dass Deepseek Auswirkungen auf die US -Finanzbranche hat.

Eine Anleitung zum Unit-Testen gleichzeitiger Go-Funktionen Eine Anleitung zum Unit-Testen gleichzeitiger Go-Funktionen May 03, 2024 am 10:54 AM

Das Testen gleichzeitiger Funktionen in Einheiten ist von entscheidender Bedeutung, da dies dazu beiträgt, ihr korrektes Verhalten in einer gleichzeitigen Umgebung sicherzustellen. Beim Testen gleichzeitiger Funktionen müssen grundlegende Prinzipien wie gegenseitiger Ausschluss, Synchronisation und Isolation berücksichtigt werden. Gleichzeitige Funktionen können Unit-Tests unterzogen werden, indem Rennbedingungen simuliert, getestet und Ergebnisse überprüft werden.

Sperr- und Synchronisationsmechanismus von C++-Funktionen in der gleichzeitigen Programmierung? Sperr- und Synchronisationsmechanismus von C++-Funktionen in der gleichzeitigen Programmierung? Apr 27, 2024 am 11:21 AM

Funktionssperren und Synchronisationsmechanismen in der gleichzeitigen C++-Programmierung werden verwendet, um den gleichzeitigen Zugriff auf Daten in einer Multithread-Umgebung zu verwalten und Datenkonkurrenz zu verhindern. Zu den Hauptmechanismen gehören: Mutex (Mutex): ein Synchronisierungsprimitiv auf niedriger Ebene, das sicherstellt, dass jeweils nur ein Thread auf den kritischen Abschnitt zugreift. Bedingungsvariable (ConditionVariable): Ermöglicht Threads, auf die Erfüllung von Bedingungen zu warten, und ermöglicht die Kommunikation zwischen Threads. Atomare Operation: Einzelanweisungsoperation, die eine Single-Thread-Aktualisierung von Variablen oder Daten gewährleistet, um Konflikte zu vermeiden.

Wie kann ich einen Zeiger in Golang zurückgeben? Wie kann ich einen Zeiger in Golang zurückgeben? Apr 23, 2024 pm 02:09 PM

Die Rückgabe von Zeigern in Go ermöglicht den direkten Zugriff auf Rohdaten. Die Syntax für die Rückgabe eines Zeigers besteht in der Verwendung eines Typs mit vorangestelltem Sternchen, zum Beispiel: funcgetPointer()int{varxint=10;return&x}. Zeiger können verwendet werden, um Daten dynamisch zuzuordnen, indem die neue Funktion verwendet und der Zeiger dereferenziert wird, um den Wert festzulegen. Rückgabezeiger sollten auf Parallelitätssicherheit, Aliasing und Anwendbarkeit achten.

Wie implementiert man sperrenfreie Datenstrukturen in der gleichzeitigen Java-Programmierung? Wie implementiert man sperrenfreie Datenstrukturen in der gleichzeitigen Java-Programmierung? May 02, 2024 am 10:21 AM

Sperrenfreie Datenstrukturen in der gleichzeitigen Java-Programmierung Bei der gleichzeitigen Programmierung sind sperrenfreie Datenstrukturen von entscheidender Bedeutung, da sie es mehreren Threads ermöglichen, gleichzeitig auf dieselben Daten zuzugreifen und diese zu ändern, ohne Sperren zu erwerben. Dies verbessert die Anwendungsleistung und den Durchsatz erheblich. In diesem Artikel werden häufig verwendete sperrenfreie Datenstrukturen und deren Implementierung in Java vorgestellt. Die CAS-Operation Compare-and-Swap (CAS) ist der Kern sperrenfreier Datenstrukturen. Es handelt sich um eine atomare Operation, die eine Variable aktualisiert, indem sie den aktuellen Wert mit dem erwarteten Wert vergleicht. Wenn der Wert der Variablen dem erwarteten Wert entspricht, ist die Aktualisierung erfolgreich; andernfalls schlägt die Aktualisierung fehl. Sperrenfreie Warteschlange ConcurrentLinkedQueue ist eine sperrenfreie Warteschlange, die mithilfe einer verknüpften Listenstruktur implementiert wird. Es ermöglicht effizientes Einfügen und Löschen

Wie verwende ich atomare Klassen in der Parallelität und im Multithreading von Java-Funktionen? Wie verwende ich atomare Klassen in der Parallelität und im Multithreading von Java-Funktionen? Apr 28, 2024 pm 04:12 PM

Atomare Klassen sind threadsichere Klassen in Java, die unterbrechungsfreie Vorgänge ermöglichen und für die Gewährleistung der Datenintegrität in gleichzeitigen Umgebungen von entscheidender Bedeutung sind. Java stellt die folgenden atomaren Klassen bereit: AtomicIntegerAtomicLongAtomicReferenceAtomicBoolean Diese Klassen stellen Methoden zum Abrufen, Festlegen und Vergleichen von Werten bereit, um sicherzustellen, dass der Vorgang atomar ist und nicht durch Threads unterbrochen wird. Atomare Klassen sind nützlich, wenn Sie mit gemeinsam genutzten Daten arbeiten und Datenbeschädigungen verhindern, z. B. bei der Verwaltung gemeinsam genutzter Zähler für den gleichzeitigen Zugriff.

See all articles