今天來說下gobox中的shardmap系忙。
golang中的map使用簡單惠豺,但并發(fā)寫入時银还,如果不加鎖,會導(dǎo)致panic蛹疯,所以性能很差。
shardmap就是為了解決這個問題热监,其核心思想就是通過創(chuàng)建多個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
歡迎大家使用苦始,使用中有遇到問題隨時反饋,我們會盡快響應(yīng)陌选,謝謝理郑!