Sobes.tech
Senior

Πώς υλοποιήθηκε η προσωρινή αποθήκευση δεδομένων; Ποια πολιτική cache χρησιμοποιήθηκε;

sobes.tech AI

Απάντηση από AI

Η προσωρινή αποθήκευση δεδομένων υλοποιείται συνήθως με μια δομή δεδομένων που αποθηκεύει πρόσφατα ή συχνά χρησιμοποιούμενα αντικείμενα για γρήγορη πρόσβαση.

Η πολιτική cache εξαρτάται από το έργο, αλλά συχνά χρησιμοποιούνται:

  • LRU (Least Recently Used) — διαγράφουν τα λιγότερο πρόσφατα χρησιμοποιούμενα στοιχεία.
  • LFU (Least Frequently Used) — διαγράφουν τα λιγότερο συχνά χρησιμοποιούμενα.
  • TTL (Time To Live) — τα στοιχεία διαγράφονται μετά από ορισμένο χρόνο.

Στο Go, για την cache, μπορεί να χρησιμοποιηθεί ένα χάρτης με πρόσθετη λογική για την πολιτική διαγραφής ή έτοιμα βιβλιοθήκες (π.χ., groupcache ή ristretto).

Παράδειγμα απλής LRU cache με χρήση λίστας:

import (
    "container/list"
    "sync"
)

type CacheItem struct {
    key   string
    value interface{}
}

type LRUCache struct {
    capacity int
    cache    map[string]*list.Element
    list     *list.List
    mu       sync.Mutex
}

func NewLRUCache(cap int) *LRUCache {
    return &LRUCache{
        capacity: cap,
        cache:    make(map[string]*list.Element),
        list:     list.New(),
    }
}

func (c *LRUCache) Get(key string) (interface{}, bool) {
    c.mu.Lock()
    defer c.mu.Unlock()

    if elem, ok := c.cache[key]; ok {
        c.list.MoveToFront(elem)
        return elem.Value.(*CacheItem).value, true
    }
    return nil, false
}

func (c *LRUCache) Put(key string, value interface{}) {
    c.mu.Lock()
    defer c.mu.Unlock()

    if elem, ok := c.cache[key]; ok {
        c.list.MoveToFront(elem)
        elem.Value.(*CacheItem).value = value
        return
    }

    if c.list.Len() == c.capacity {
        back := c.list.Back()
        if back != nil {
            c.list.Remove(back)
            delete(c.cache, back.Value.(*CacheItem).key)
        }
    }

    item := &CacheItem{key, value}
    elem := c.list.PushFront(item)
    c.cache[key] = elem
}