search
HomeBackend DevelopmentGolangHow are keys in KV Store locked?

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

php Editor Zimo will reveal the secret of key locking in KV Store for you. In KV Store, key locking is achieved through a series of complex algorithms and technologies. First, the system generates a unique identifier for each key and stores it with the corresponding value in the database. At the same time, the system will also use a hash function to encrypt the key to ensure its security. In addition, the system also uses access control lists (ACLs) to restrict access to keys so that only authorized users can perform read and write operations. Through these security measures, KV Store ensures the security and reliability of keys and provides users with safe and reliable data storage services.

Question content

I am building a distributed kv store just to learn more about distributed systems and concurrency. The implementation of kv storage I'm building is fully transactional, with an in-memory transaction log. To keep things simple, storage is also entirely in-memory. The api exposes get, insert, update, remove. Note that all endpoints operate on a single key, not a range of keys.

I manage concurrency through locks. However, I have a global lock that locks the entire data store. This sounds very inefficient, because if I want to read the value of k1 while updating k2, I have to wait for k2 to finish updating, although that's irrelevant.

I know some databases use more fine-grained locking. For example, in mysql server there are row level locks. How to implement key-level locking?

I have

type storage struct {
  store map[string]int32
}

Should I add something like this? :

type Storage struct {
  store map[string]int32
  locks map[string]mutex.Lock
}

If I do this, the problem is that locks must be kept in sync with store. Another option would be to merge the two maps, but even then I would encounter removing entries in the map while locked if the remove request comes before the get The problem.

Solution

Concept part

trade

First of all, strong consistency does not require transaction logs. Transaction logs are useful for maintaining acid properties.

Transactions are also not a strict requirement for strong consistency in a database, but they can be a useful tool for ensuring consistency in many situations.

Strong consistency refers to the property that ensures that all reads from the database will return the most recent write, regardless of where the read operation is performed. In other words, strong consistency guarantees that all clients will see the same data and that the data will be up-to-date and consistent across the system.

You can use consensus algorithms such as paxos or raft to ensure strong consistency. When storing data, you can store a version of the data and use it as an id in paxos.

Lock kv storage

In a key-value (kv) store, keys are usually locked using some kind of locking mechanism, such as a mutex or reader-writer lock (as @paulsm4 suggested). This allows multiple threads or processes to access and modify data in the kv store simultaneously while still ensuring that the data remains consistent and correct.

For example, when a thread or process wants to read or modify a specific key in the kv store, it can acquire a lock on that key. This prevents other threads or processes from modifying the same key at the same time, causing race conditions and other problems. Once a thread or process has finished reading or modifying the key, the lock can be released, allowing other threads or processes to access the key.

The specific details of how keys are locked in kv storage may vary depending on the implementation of kv storage. Some kv stores may use global locks (as you are already doing, which is sometimes inefficient) to lock the entire data store, while other kv stores may use more fine-grained locking mechanisms such as row-level locks or key-level Lock to allow more operations. Concurrent access to data.

So, tldr; conceptually, you're right. The problem lies in the implementation details of locking.

coding

To strictly answer the question about locking, consider reader-writer locks as @paulsm4 suggested. In golang, a similar lock is rwmutex. It is used for sync. map.

Here is a short example:

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
}

In addition to this, you need paxos to ensure consistency between replicas.

The above is the detailed content of How are keys in KV Store locked?. For more information, please follow other related articles on the PHP Chinese website!

Statement
This article is reproduced at:stackoverflow. If there is any infringement, please contact admin@php.cn delete
Mastering Go Strings: A Deep Dive into the 'strings' PackageMastering Go Strings: A Deep Dive into the 'strings' PackageMay 12, 2025 am 12:05 AM

You should care about the "strings" package in Go because it provides tools for handling text data, splicing from basic strings to advanced regular expression matching. 1) The "strings" package provides efficient string operations, such as Join functions used to splice strings to avoid performance problems. 2) It contains advanced functions, such as the ContainsAny function, to check whether a string contains a specific character set. 3) The Replace function is used to replace substrings in a string, and attention should be paid to the replacement order and case sensitivity. 4) The Split function can split strings according to the separator and is often used for regular expression processing. 5) Performance needs to be considered when using, such as

'encoding/binary' Package in Go: Your Go-To for Binary Operations'encoding/binary' Package in Go: Your Go-To for Binary OperationsMay 12, 2025 am 12:03 AM

The"encoding/binary"packageinGoisessentialforhandlingbinarydata,offeringtoolsforreadingandwritingbinarydataefficiently.1)Itsupportsbothlittle-endianandbig-endianbyteorders,crucialforcross-systemcompatibility.2)Thepackageallowsworkingwithcus

Go Byte Slice Manipulation Tutorial: Mastering the 'bytes' PackageGo Byte Slice Manipulation Tutorial: Mastering the 'bytes' PackageMay 12, 2025 am 12:02 AM

Mastering the bytes package in Go can help improve the efficiency and elegance of your code. 1) The bytes package is crucial for parsing binary data, processing network protocols, and memory management. 2) Use bytes.Buffer to gradually build byte slices. 3) The bytes package provides the functions of searching, replacing and segmenting byte slices. 4) The bytes.Reader type is suitable for reading data from byte slices, especially in I/O operations. 5) The bytes package works in collaboration with Go's garbage collector, improving the efficiency of big data processing.

How do you use the 'strings' package to manipulate strings in Go?How do you use the 'strings' package to manipulate strings in Go?May 12, 2025 am 12:01 AM

You can use the "strings" package in Go to manipulate strings. 1) Use strings.TrimSpace to remove whitespace characters at both ends of the string. 2) Use strings.Split to split the string into slices according to the specified delimiter. 3) Merge string slices into one string through strings.Join. 4) Use strings.Contains to check whether the string contains a specific substring. 5) Use strings.ReplaceAll to perform global replacement. Pay attention to performance and potential pitfalls when using it.

How to use the 'bytes' package to manipulate byte slices in Go (step by step)How to use the 'bytes' package to manipulate byte slices in Go (step by step)May 12, 2025 am 12:01 AM

ThebytespackageinGoishighlyeffectiveforbyteslicemanipulation,offeringfunctionsforsearching,splitting,joining,andbuffering.1)Usebytes.Containstosearchforbytesequences.2)bytes.Splithelpsbreakdownbyteslicesusingdelimiters.3)bytes.Joinreconstructsbytesli

GO bytes package: What are the alternatives?GO bytes package: What are the alternatives?May 11, 2025 am 12:11 AM

ThealternativestoGo'sbytespackageincludethestringspackage,bufiopackage,andcustomstructs.1)Thestringspackagecanbeusedforbytemanipulationbyconvertingbytestostringsandback.2)Thebufiopackageisidealforhandlinglargestreamsofbytedataefficiently.3)Customstru

Manipulating Byte Slices in Go: The Power of the 'bytes' PackageManipulating Byte Slices in Go: The Power of the 'bytes' PackageMay 11, 2025 am 12:09 AM

The"bytes"packageinGoisessentialforefficientlymanipulatingbyteslices,crucialforbinarydata,networkprotocols,andfileI/O.ItoffersfunctionslikeIndexforsearching,Bufferforhandlinglargedatasets,Readerforsimulatingstreamreading,andJoinforefficient

Go Strings Package: A Comprehensive Guide to String ManipulationGo Strings Package: A Comprehensive Guide to String ManipulationMay 11, 2025 am 12:08 AM

Go'sstringspackageiscrucialforefficientstringmanipulation,offeringtoolslikestrings.Split(),strings.Join(),strings.ReplaceAll(),andstrings.Contains().1)strings.Split()dividesastringintosubstrings;2)strings.Join()combinesslicesintoastring;3)strings.Rep

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

SecLists

SecLists

SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.