Junior — Middle
Төрттүрдүү шарддарды колдонуп, өзүнчө окуу жана жазуу операцияларын ишке ашырууга болобу?
sobes.tech AI
AIден жооп
Һе, Go'да айрым окуу жана жазуу операцияларын ар кандай shard'тар (бөлүктөр) аркылуу ишке ашыруу мүмкүн, бул иштөө ылдамдыгын жогорулатууга жана блоктоолорду азайтууга жардам берет.
Идея — жалпы маалымат структурасын бир нече көз карандысыз shard'тарга бөлүү, ар бирине өзүнүн mutex (мисалы, mutex) менен камсыз кылуу. Окуу жана жазуу операциялары тиешелүү shard'ка ачкычтын хеш-функциясы аркылуу багытталат.
Артыкчылыктары:
- Ар кандай ачкычтар менен параллелдүү операциялар бири-бирине тоскоолдук кылбай аткарылат.
- Глобалдык mutex үчүн атаандаштык азайтылат.
Жөнөкөйлөштүрүлгөн shard карта мисалы:
импорт (
"hash/fnv"
"sync"
)
type shard struct {
sync.RWMutex
m map[string]interface{}
}
type ShardedMap struct {
shards []shard
}
func NewShardedMap(numShards int) *ShardedMap {
shards := make([]shard, numShards)
for i := range shards {
shards[i].m = make(map[string]interface{})
}
return &ShardedMap{shards: shards}
}
func (sm *ShardedMap) getShard(key string) *shard {
h := fnv.New32a()
h.Write([]byte(key))
return &sm.shards[uint(h.Sum32())%uint(len(sm.shards))]
}
func (sm *ShardedMap) Set(key string, value interface{}) {
s := sm.getShard(key)
s.Lock()
defer s.Unlock()
s.m[key] = value
}
func (sm *ShardedMap) Get(key string) (interface{}, bool) {
s := sm.getShard(key)
s.RLock()
defer s.RUnlock()
val, ok := s.m[key]
return val, ok
}
Бул ыкма менен жазуу жана окуу операциялары ар кандай shard mutex'тери аркылуу бөлүнүп, масштабдуулук жогорулатылат.