搜尋
首頁後端開發GolangKV Store 中的金鑰是如何鎖定的?

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

php小編子墨將為您揭開KV Store中密鑰鎖定的奧秘。在KV Store中,金鑰的鎖定是透過一系列複雜的演算法和技術實現的。首先,系統會為每個密鑰產生一個唯一的標識符,並將其與對應的值儲存在資料庫中。同時,系統也會採用雜湊函數對金鑰進行加密,確保其安全性。此外,系統也會使用存取控制清單(ACL)來限制對金鑰的存取權限,只有授權的使用者才能進行讀寫操作。透過這些安全措施,KV Store保證了金鑰的安全性和可靠性,為用戶提供了安全可靠的資料儲存服務。

問題內容

我正在建立一個分散式 kv 存儲,只是為了更多地了解分散式系統和並發性。我正在建立的 kv 儲存的實作是完全事務性的,具有記憶體中事務日誌。為了簡單起見,儲存也完全位於記憶體中。該 api 公開 getinsertupdateremove。請注意,所有端點都在單一鍵上運行,而不是在一系列鍵上運行。

我透過鎖定管理並發。但是,我有一個全域鎖來鎖定整個資料儲存。這聽起來效率非常低,因為如果我想在更新 k2 時讀取 k1 的值,我必須等待 k2 完成更新,儘管不相關。

我知道有些資料庫使用更細緻的鎖定。例如,在 mysql 伺服器中存在行級鎖定。鍵級鎖如何實現?

我有

type storage struct {
  store map[string]int32
}

我應該要加這樣的東西嗎? :

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

如果我這樣做,問題是 locks 必須與 store 保持同步。另一個選擇是合併兩個映射,但即便如此,如果remove 請求出現在get 之前,我也會遇到在鎖定時刪除映射中的條目的問題。

解決方法

概念部分

交易

首先,強一致性不需要交易日誌。交易日誌對於維護 acid 屬性非常有用。

事務也不是資料庫中強一致性的嚴格要求,但它們可以成為在許多情況下確保一致性的有用工具。

強一致性是指確保資料庫的所有讀取都會傳回最近的寫入的屬性,無論讀取操作在何處執行。換句話說,強一致性保證所有客戶端都會看到相同的數據,並且數據在整個系統中都是最新的和一致的。

您可以使用paxos或raft等共識演算法來保證強一致性。儲存資料時,資料可以儲存一個版本,並將其作為paxos中的id。

鎖定 kv 儲存

在鍵值(kv)儲存中,鍵通常使用某種鎖定機制來鎖定,例如互斥鎖或讀寫器鎖(如@paulsm4所建議)。這允許多個執行緒或進程同時存取和修改 kv 儲存中的數據,同時仍確保資料保持一致和正確。

例如,當執行緒或程序想要讀取或修改 kv 儲存中的特定鍵時,它可以取得該鍵的鎖。這可以防止其他執行緒或進程同時修改相同鍵,從而導致競爭條件和其他問題。一旦執行緒或程序完成讀取或修改金鑰,就可以釋放鎖,允許其他執行緒或程序存取該金鑰。

如何在 kv 儲存中鎖定金鑰的具體細節可能會有所不同,具體取決於 kv 儲存的實作。一些kv 存儲可能會使用全域鎖(正如您已經在做的那樣,這有時效率很低)來鎖定整個資料存儲,而其他kv 存儲可能會使用更細粒度的鎖定機制,例如行級鎖或鍵級鎖,以允許更多的操作。並發存取資料。

所以,tldr;從概念上講,你是對的。問題在於鎖定的實作細節。

編碼

要嚴格回答有關鎖定的問題,可以考慮讀寫器鎖定 正如@paulsm4 所建議的。在golang中,類似的鎖是 rwmutex。它用於 sync。 map.

這是一個簡短的範例:

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
}

除此之外,您還需要 paxos 以確保副本之間的一致性。

以上是KV Store 中的金鑰是如何鎖定的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:stackoverflow。如有侵權,請聯絡admin@php.cn刪除
Golang和Python:了解差異Golang和Python:了解差異Apr 18, 2025 am 12:21 AM

Golang和Python的主要區別在於並發模型、類型系統、性能和執行速度。 1.Golang使用CSP模型,適用於高並發任務;Python依賴多線程和GIL,適合I/O密集型任務。 2.Golang是靜態類型,Python是動態類型。 3.Golang編譯型語言執行速度快,Python解釋型語言開發速度快。

Golang vs.C:評估速度差Golang vs.C:評估速度差Apr 18, 2025 am 12:20 AM

Golang通常比C 慢,但Golang在並發編程和開發效率上更具優勢:1)Golang的垃圾回收和並發模型使其在高並發場景下表現出色;2)C 通過手動內存管理和硬件優化獲得更高性能,但開發複雜度較高。

Golang:雲計算和DevOps的關鍵語言Golang:雲計算和DevOps的關鍵語言Apr 18, 2025 am 12:18 AM

Golang在雲計算和DevOps中的應用廣泛,其優勢在於簡單性、高效性和並發編程能力。 1)在雲計算中,Golang通過goroutine和channel機制高效處理並發請求。 2)在DevOps中,Golang的快速編譯和跨平台特性使其成為自動化工具的首選。

Golang和C:了解執行效率Golang和C:了解執行效率Apr 18, 2025 am 12:16 AM

Golang和C 在執行效率上的表現各有優勢。 1)Golang通過goroutine和垃圾回收提高效率,但可能引入暫停時間。 2)C 通過手動內存管理和優化實現高性能,但開發者需處理內存洩漏等問題。選擇時需考慮項目需求和團隊技術棧。

Golang vs. Python:並發和多線程Golang vs. Python:並發和多線程Apr 17, 2025 am 12:20 AM

Golang更適合高並發任務,而Python在靈活性上更有優勢。 1.Golang通過goroutine和channel高效處理並發。 2.Python依賴threading和asyncio,受GIL影響,但提供多種並發方式。選擇應基於具體需求。

Golang和C:性能的權衡Golang和C:性能的權衡Apr 17, 2025 am 12:18 AM

Golang和C 在性能上的差異主要體現在內存管理、編譯優化和運行時效率等方面。 1)Golang的垃圾回收機制方便但可能影響性能,2)C 的手動內存管理和編譯器優化在遞歸計算中表現更為高效。

Golang vs. Python:申請和用例Golang vs. Python:申請和用例Apr 17, 2025 am 12:17 AM

selectgolangforhighpperformanceandcorrency,ifealforBackendServicesSandNetwork程序; selectpypypythonforrapiddevelopment,dataScience和machinelearningDuetoitsverserverserverserversator versator anderticality andextility andextentensivelibraries。

Golang vs. Python:主要差異和相似之處Golang vs. Python:主要差異和相似之處Apr 17, 2025 am 12:15 AM

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。Golang以其并发模型和高效性能著称,Python则以简洁语法和丰富库生态系统著称。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。