golang 每日一庫之 concurrent-map

概述

orcaman/concurrent-map/v2 是一個 Go 語言的高性能併發安全哈希表實現。它通過分片鎖(shard locking)策略減少鎖競爭,適用於高併發讀寫場景。與標準庫的 sync.Map 不同,該庫針對通用鍵值類型優化,提供更靈活的 API 和更高性能。

項目地址

核心特性

  1. 分片鎖機制:
  1. 泛型支持:
  1. 豐富的 API:
  1. 性能優化:

使用示例

package main

import (
"fmt"
 cmap "github.com/orcaman/concurrent-map/v2"
)

func main() {
// 初始化併發map(鍵類型string,值類型int)
 m := cmap.New[string, int]()

// 設置值
 m.Set("apple", 10)
 m.Set("banana", 20)

// 獲取值
if val, ok := m.Get("apple"); ok {
 fmt.Println("apple:", val) // 輸出: apple: 10
 }

// 刪除鍵
 m.Remove("banana")

// 遍歷所有元素
for item := range m.Iter() {
 fmt.Printf("Key: %s, Val: %d\n", item.Key, item.Val)
 }

// 獲取元素總數
 fmt.Println("Total items:", m.Count())
}

與 sync.Map 的對比

Qmf0J8

適用場景

注意事項

  1. 鍵的可哈希性

    :鍵類型必須實現正確的哈希函數(如 stringint 等內置類型無需處理)。

  2. 分片數選擇

    :默認 32 分片適用於多數場景,若鍵分佈不均可調整分片數。

    m := cmap.NewWithShards[string, int](64) // 自定義分片數
    
  3. 遍歷一致性

    Iter() 方法返回的通道可能在遍歷時反映後續修改,需業務層處理一致性。

版本變化(v2 vs v1)

社區與生態

總結:orcaman/concurrent-map/v2 是 Go 開發者處理高併發哈希表需求的優選,憑藉分片鎖和泛型設計,在性能與易用性間取得平衡。推薦在需要頻繁寫入、泛型支持的場景下替代 sync.Map

標題:golang 每日一庫之 concurrent-map
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/02/28/1740704438456.html

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Ntpd_U69jMo3VdNWr2l2Eg