capypad
0 Tage Serie
go / expert
Snippet

Hoch-performante Map durch Lock-Striping

Lock-Striping ist ein Entwurfsmuster zur Reduzierung von Ressourcenkonflikten, indem eine geteilte Ressource in mehrere unabhängige 'Shards' mit jeweils eigenem Lock aufgeteilt wird. In Umgebungen mit hoher Parallelität wird ein einzelner globaler Mutex auf einer Map zum Flaschenhals. Durch Hashing des Schlüssels zur Auswahl eines Shards können mehrere Goroutinen gleichzeitig auf verschiedene Teile der Map zugreifen.

snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
type Shard struct {
sync.RWMutex
m map[string]string
}
 
type ShardedMap []*Shard
 
func (s ShardedMap) getShard(key string) *Shard {
return s[uint32(crc32.ChecksumIEEE([]byte(key)))%uint32(len(s))]
}
 
func (s ShardedMap) Get(key string) string {
shard := s.getShard(key)
shard.RLock()
defer shard.RUnlock()
return shard.m[key]
}
Erklärung
1
type Shard struct
Definiert ein Datensegment, das durch einen eigenen Mutex geschützt ist.
2
s[uint32(crc32.ChecksumIEEE([]byte(key)))%uint32(len(s))]
Bestimmt über Hashing, welcher Shard für den gegebenen Schlüssel zuständig ist.