Sobes.tech
Junior — Middle

Ի՞նչ մեթոդներ եք նախընտրում օգտագործել ձեր նախագծերում և ինչու՞:

sobes.tech AI

Պատասխան AI-ից

Go-ում հաճախ օգտագործվում են հետևյալ մոտեցումները կեշավորման համար՝

  • Ներքին տվյալների կառուցվածքներ՝ սինխրոնիզացիայով: օրինակ, map՝ sync.RWMutex-ով՝ բազմաաշխատանքային անվտանգ մուտքի համար:
  • Երրորդ կողմի գրադարանային փաթեթներ: օրինակ, golang-lru՝ LRU կեշի իրականացման համար, որը ավտոմատ կերպով հեռացնում է ամենաքիչ օգտագործվող տարրերը:
  • sync.Map: ստանդարտ գրադարանի բազմաաշխատանքային անվտանգ քարտեզ՝ բարձր մրցակցությամբ կեշերի համար:

Ընտրությունը կախված է գործից:

  • Պարզ կեշ՝ մուտքի վերահսկմամբ — map + sync.RWMutex:
  • Հաշվարկի սահմանափակմամբ և ավտոմատ հեռացմամբ — արտաքին գրադարանների LRU կեշ:
  • Բարձր կատարողական դեպքերում՝ հաճախակի ընթերցումներով և հազվադեպ գրառումներով — sync.Map:

Պարզ օրինակ՝ sync.RWMutex-ով կեշի:

 type Cache struct {
    mu sync.RWMutex
    data map[string]interface{}
}

func (c *Cache) Get(key string) (interface{}, bool) {
    c.mu.RLock()
    defer c.mu.RUnlock()
    val, ok := c.data[key]
    return val, ok
}

func (c *Cache) Set(key string, value interface{}) {
    c.mu.Lock()
    defer c.mu.Unlock()
    c.data[key] = value
}

Այս մոտեցումը պարզ է և արդյունավետ՝ մեծամասնության դեպքերում։