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
}