Sobes.tech
Junior — Middle

LRU önbelleğinin çalışma prensibini ve hangi durumlarda kullanıldığını açıklayabilir misiniz?

sobes.tech yapay zeka

AI'dan gelen yanıt

LRU (En Çok Kullanılanlar Az Kullanılanlar) önbelleği, sınırlı sayıda öğe tutan ve dolduğunda en eski kullanılmayan öğeyi kaldıran bir veri yapısıdır.

Çalışma prensibi:

  • Bir öğeye erişildiğinde, o öğe "en yeni" hale gelir.
  • Önbellek doluysa ve yeni bir öğe eklenmesi gerekiyorsa, en uzun süredir kullanılmayan öğe kaldırılır.

Bu, belleği verimli kullanmayı sağlar ve en güncel verileri tutar.

Uygulamalar:

  • Veritabanı sorgu sonuçlarının önbelleğe alınması.
  • Bellekte resim veya dosya önbelleği.
  • Kaynakları sınırlı sistemlerde veri erişimini optimize etmek.

Go dilinde basitleştirilmiş örnek:

// Kullanım sırasını tutmak için list konteyneri kullanıyoruz
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
}