Sobes.tech
Junior — Middle

Kannst du das Funktionsprinzip des LRU-Caches erklären und in welchen Situationen er angewendet wird?

sobes.tech KI

Antwort von AI

Der LRU-Cache (Least Recently Used) ist eine Datenstruktur, die eine begrenzte Anzahl von Elementen speichert und beim Überlauf das am längsten nicht verwendete Element entfernt.

Funktionsprinzip:

  • Beim Zugriff auf ein Element wird es zum "neueren".
  • Wenn der Cache voll ist und ein neues Element hinzugefügt werden soll, wird das am längsten nicht verwendete Element entfernt.

Dies ermöglicht eine effiziente Nutzung des Speichers, indem die relevantesten Daten behalten werden.

Anwendungen:

  • Caching von Datenbankabfrageergebnissen.
  • Caching von Bildern oder Dateien im Speicher.
  • In ressourcenbeschränkten Systemen zur Optimierung des Datenzugriffs.

Beispiel in Go (vereinfachte Version):

// Verwendung des container/list zur Verwaltung der Nutzungsreihenfolge
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
}