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
}