Sobes.tech
Senior

Чӣ кэш карда шуд? Тек феҳристҳо?

sobes.tech AI

Ҷавоб аз AI

Захира кардани мӯҳр танҳо ба каталогҳо татбиқ намешавад, балки ба намудҳои дигар маълумот, ки зуд дархост мешаванд ва камтар тағйир меёбанд, низ татбиқ мешавад. Масалан:

  • Натиҷаҳои ҳисобҳои мураккаб ё ҷамъбастҳо, то ки дар ҳар дархост дубора ҳисоб накунанд.
  • Ҷавобҳо аз APIҳои хориҷӣ, то борро кам кунад ва таъхирҳоро коҳиш диҳад.
  • Сессияҳои корбар ва токенҳои тасдиқ барои дастрасии зуд.

Дар Go, одатан, ман структураҳои додаҳои дарунсохтро истифода мебарам, масалан, харита бо mutex барои бехатарии сӯзишворӣ, ё китобхонаҳои кеши сторонӣ (масалан, groupcache, ristretto), ки TTL, тоза кардани автоматии маълумоти кӯҳна ва идоракунии самараноки хотираро таъмин мекунанд.

Масали кеши оддӣ бо 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
}