Sobes.tech
Junior — Middle

Μπορείτε να εξηγήσετε την αρχή λειτουργίας της cache LRU και σε ποιες περιπτώσεις εφαρμόζεται;

sobes.tech AI

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

Ο cache LRU (Least Recently Used) είναι μια δομή δεδομένων που αποθηκεύει έναν περιορισμένο αριθμό στοιχείων και διαγράφει το πιο παλιό και μη χρησιμοποιημένο στοιχείο όταν γεμίζει.

Αρχή λειτουργίας:

  • Όταν γίνεται πρόσβαση σε ένα στοιχείο, γίνεται το "πιο πρόσφατο".
  • Αν ο cache είναι γεμάτος και πρέπει να προστεθεί ένα νέο στοιχείο, διαγράφεται το πιο παλιό και μη χρησιμοποιημένο.

Αυτό επιτρέπει την αποδοτική χρήση της μνήμης, διατηρώντας τα πιο σχετικά δεδομένα.

Εφαρμογές:

  • Cache αποτελεσμάτων ερωτημάτων σε βάσεις δεδομένων.
  • Cache εικόνων ή αρχείων στη μνήμη.
  • Σε συστήματα με περιορισμένους πόρους για βελτιστοποίηση της πρόσβασης στα δεδομένα.

Παράδειγμα σε Go (απλοποιημένο):

// Χρησιμοποιούμε το container/list για την αποθήκευση της σειράς χρήσης
import (
    "container/list"
)

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

type entry struct {
    key   int
    value int
}

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

func (c *LRUCache) Get(key int) (int, bool) {
    if elem, ok := c.cache[key]; ok {
        c.list.MoveToFront(elem)
        return elem.Value.(*entry).value, true
    }
    return 0, false
}

func (c *LRUCache) Put(key, value int) {
    if elem, ok := c.cache[key]; ok {
        c.list.MoveToFront(elem)
        elem.Value.(*entry).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.(*entry).key)
        }
    }
    elem := c.list.PushFront(&entry{key, value})
    c.cache[key] = elem
}