Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk melaksanakan sistem cache algoritma LRU dalam golang

Bagaimana untuk melaksanakan sistem cache algoritma LRU dalam golang

PHPz
PHPzasal
2023-04-05 13:47:13914semak imbas

LRU (Kurang Terbaharu Digunakan) ialah algoritma caching Ia boleh cache data yang digunakan baru-baru ini dahulu dan menghapuskan data yang tidak digunakan untuk masa yang lama di bawah kapasiti cache terhad, dengan itu mencapai penggunaan ruang cache yang cekap dan meningkatkan kelajuan akses data. .

Bahasa Go (golang) ialah bahasa pengaturcaraan yang cekap yang digemari oleh pembangun kerana keupayaan konkurensi dan pengurusan memori yang sangat baik. Dalam artikel ini, kami akan melaksanakan sistem caching untuk algoritma LRU dan menggunakan bahasa Go untuk melaksanakannya.

Idea reka bentuk

Sebelum melaksanakan sistem cache LRU, kita perlu menentukan keperluan sistem dan idea reka bentuk.

Pertama sekali, kami memerlukan struktur data untuk menyimpan data cache ini perlu menyokong akses pantas dan kemas kini, dan juga perlu menyokong penghapusan data mengikut masa penggunaan. Struktur data yang biasa digunakan termasuk senarai terpaut, jadual cincang, senarai terpaut dua kali, dsb. Antaranya, senarai terpaut dua kali ialah pilihan terbaik untuk melaksanakan algoritma LRU.

Kedua, kami memerlukan beberapa operasi untuk mengakses dan mengemas kini struktur data ini. Operasi biasa termasuk: membaca data cache, menulis data cache, mengemas kini data cache, memadam data cache, dsb.

Akhir sekali, kami memerlukan beberapa strategi caching untuk mengawal saiz cache dan menghalang cache daripada mengisi keseluruhan memori. Strategi yang biasa digunakan termasuk FIFO (masuk pertama, keluar dahulu), LFU (paling jarang digunakan), LRU (paling kurang digunakan baru-baru ini), dll. Antaranya, LRU ialah pilihan terbaik untuk melaksanakan sistem cache LRU.

Pelaksanaan Kod

Sekarang kami mempunyai idea reka bentuk yang jelas, kami boleh mula melaksanakan sistem cache LRU kami. Kodnya adalah seperti berikut:

package lruCache

import "container/list"

type Cache struct {
    MaxBytes  int64
    nBytes    int64
    ll        *list.List
    cache     map[string]*list.Element
    OnEvicted func(key string, value Value)
}

type entry struct {
    key   string
    value Value
}

type Value interface {
    Len() int
}

func (c *Cache) Add(key string, value Value) {
    if e, ok := c.cache[key]; ok {
        c.ll.MoveToFront(e)
        kv := e.Value.(*entry)
        c.nBytes += int64(value.Len()) - int64(kv.value.Len())
        kv.value = value
    } else {
        ele := c.ll.PushFront(&entry{key, value})
        c.cache[key] = ele
        c.nBytes += int64(len(key)) + int64(value.Len())
    }
    for c.MaxBytes != 0 && c.MaxBytes < c.nBytes {
        c.RemoveOldest()
    }
}

func (c *Cache) Get(key string) (value Value, ok bool) {
    if ele, ok := c.cache[key]; ok {
        c.ll.MoveToFront(ele)
        kv := ele.Value.(*entry)
        return kv.value, true
    }
    return
}

func (c *Cache) RemoveOldest() {
    ele := c.ll.Back()
    if ele != nil {
        c.ll.Remove(ele)
        kv := ele.Value.(*entry)
        delete(c.cache, kv.key)
        c.nBytes -= int64(len(kv.key)) + int64(kv.value.Len())
        if c.OnEvicted != nil {
            c.OnEvicted(kv.key, kv.value)
        }
    }
}

Contoh Penggunaan

Kini, kami telah melaksanakan sistem cache LRU yang mudah. Kita boleh menggunakannya melalui kod sampel berikut:

package main

import (
    "fmt"
    "go-lru-cache/lruCache"
)

type stringValue string

func (s stringValue) Len() int {
    return len(s)
}

func main() {
    cache := lruCache.Cache{
        MaxBytes: 1000,
        OnEvicted: func(key string, value lruCache.Value) {
            fmt.Printf("key=%s, value=%s is evicted\n", key, value)
        },
    }
    cache.Add("key1", stringValue("123"))
    cache.Add("key2", stringValue("456"))
    cache.Add("key3", stringValue("789"))
    if value, ok := cache.Get("key1"); ok {
        fmt.Println(value.(stringValue))
    }
    cache.Add("key4", stringValue("101"))
    fmt.Printf("cache.Len() = %d\n", cache.Len())
    cache.RemoveOldest()
    fmt.Printf("cache.Len() = %d\n", cache.Len())
}

Dalam kod sampel di atas, kami mentakrifkan jenis stringValue dan melaksanakan antara muka Value untuk mewakili nilai dalam cache. Kemudian, kami mencipta sistem cache LRU dan menambah 4 item cache, dengan MaxBytes mewakili kapasiti maksimum cache. Seterusnya, kami memperoleh nilai yang sepadan dengan Get dalam cache melalui kaedah key1, kemudian tambah item cache baharu, dan akhirnya padam item cache tertua.

Ringkasan

Setakat ini, kami telah berjaya melaksanakan sistem cache LRU. Melalui artikel ini, kami bukan sahaja mempelajari pelaksanaan algoritma cache LRU, tetapi juga mempelajari cara menggunakan bahasa Go untuk melaksanakan sistem cache. Dalam pembangunan sebenar, penggunaan rasional sistem cache boleh meningkatkan prestasi program dengan ketara dan mengurangkan beban sistem. Oleh itu, sistem caching adalah salah satu kemahiran penting yang harus difahami dan dikuasai oleh setiap pembangun.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan sistem cache algoritma LRU dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn