今天来说下gobox中的shardmap。
golang中的map使用简单,但并发写入时,如果不加锁,会导致panic,所以性能很差。
shardmap就是为了解决这个问题,其核心思想就是通过创建多个map,把key做hash分配到这多个map上,从而减少锁粒度以提高性能。
用法示例
package main
import (
"github.com/goinbox/shardmap"
"github.com/goinbox/crypto"
"fmt"
"strconv"
)
func main() {
shardMap := shardmap.New(32)
hasError:=false
for i := 0; i < 10000; i++ {
key := crypto.Md5String([]byte(strconv.Itoa(i)))
shardMap.Set(key, i)
v, ok := shardMap.Get(key)
if !ok || v != i {
hasError = true
fmt.Println(v, ok)
}
}
if !hasError {
fmt.Println("shardmap set get ok")
}
shardMap.Walk(func(k string, v interface{}) {
shardMap.Del(k)
_, ok := shardMap.Get(k)
if ok {
fmt.Println(v, ok)
}
})
}
输出效果示例
shardmap set get ok
性能对比
我这里还做了和golang的原生map及sync包中提供的sync.Map的写性能对比:
- 原生map
BenchmarkSimpleMapWrite-4 300000 5935 ns/op
- sync.Map
BenchmarkSyncMapWrite-4 200000 6831 ns/op
- ShardMap
BenchmarkShardMapWrite-4 300000 3815 ns/op
欢迎大家使用,使用中有遇到问题随时反馈,我们会尽快响应,谢谢!