Heim >Backend-Entwicklung >Golang >Wie werden die Schlüssel im KV Store verschlossen?
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.
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 get
、insert
、update
、remove
. 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 }
Soll ich so etwas hinzufügen? :
type Storage struct { store map[string]int32 locks map[string]mutex.Lock }
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.
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.
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.
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 rwmutex
rwmutex
。它用于 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 }
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!