golang,go,博客,开源,编程
orcaman/concurrent-map/v2
orcaman/concurrent-map/v2
是一个 Go 语言的高性能并发安全哈希表实现。它通过分片锁(shard locking)策略减少锁竞争,适用于高并发读写场景。与标准库的 sync.Map
不同,该库针对通用键值类型优化,提供更灵活的 API 和更高性能。
分片锁机制:
泛型支持:
string
, int
)和任意值类型。丰富的 API:
Set(key K, value V)
: 插入或更新键值对。Get(key K) (V, bool)
: 获取值,返回是否存在。Remove(key K)
: 删除键值对。Count() int
: 返回总元素数。Iter() <-chan Tuple
: 返回通道遍历所有键值对。Keys() []K
: 获取所有键的切片。性能优化:
sync.Map
(尤其在写操作多时)。benchmarks/
目录)。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
的对比特性 | concurrent-map/v2 | sync.Map |
---|---|---|
锁机制 | 分片锁(细粒度) | 全局锁 + 无锁读 |
键值类型 | 泛型支持(任意类型) | 固定为 interface{} |
API 友好性 | 提供 Set /Get 等方法 | 需使用 Load /Store |
适用场景 | 高频写操作 | 读多写少 |
性能 | 高并发下更优 | 简单场景下足够 |
string
、int
等内置类型无需处理)。m := cmap.NewWithShards[string, int](64) // 自定义分片数
Iter()
方法返回的通道可能在遍历时反映后续修改,需业务层处理一致性。interface{}
和反射,v2 借助泛型提升性能和类型安全。MarshalJSON
等辅助方法,聚焦核心功能。总结:orcaman/concurrent-map/v2
是 Go 开发者处理高并发哈希表需求的优选,凭借分片锁和泛型设计,在性能与易用性间取得平衡。推荐在需要频繁写入、泛型支持的场景下替代 sync.Map
。