Sobes.tech
Senior

Čo bolo v cache? Iba sprievodcov?

sobes.tech AI

Odpoveď od AI

Cacheovanie sa používalo nielen na adresáre, ale aj na iné typy údajov, ktoré sa často požadujú a zriedka sa menia. Napríklad:

  • Výsledky zložitých výpočtov alebo agregácií, aby sa pri každom požiadavku neprepočítavali.
  • Odpovede z externých API, aby sa znížilo zaťaženie a skrátili sa oneskorenia.
  • Používateľské relácie a tokeny autentifikácie pre rýchly prístup.

V Go zvyčajne používam vstavané dátové štruktúry, napríklad mapu s mutexom pre bezpečnosť vlákien, alebo knižnice cache tretích strán (napríklad groupcache, ristretto), ktoré poskytujú TTL, automatické odstraňovanie zastaraných dát a efektívne riadenie pamäte.

Príklad jednoduchého cache s TTL:

import (
    "sync"
    "time"
)

type CacheItem struct {
    Value      interface{}
    Expiration int64
}

type Cache struct {
    items map[string]CacheItem
    mu    sync.RWMutex
}

func (c *Cache) Set(key string, value interface{}, duration time.Duration) {
    c.mu.Lock()
    defer c.mu.Unlock()
    c.items[key] = CacheItem{
        Value:      value,
        Expiration: time.Now().Add(duration).UnixNano(),
    }
}

func (c *Cache) Get(key string) (interface{}, bool) {
    c.mu.RLock()
    defer c.mu.RUnlock()
    item, found := c.items[key]
    if !found || time.Now().UnixNano() > item.Expiration {
        return nil, false
    }
    return item.Value, true
}