ホームページ > バックエンド開発 > Golang > Golang で優先順位に基づいたキャッシュ削除戦略を実装します。

Golang で優先順位に基づいたキャッシュ削除戦略を実装します。

王林
リリース: 2023-06-20 20:48:09
オリジナル
692 人が閲覧しました

インターネット技術の継続的な発展に伴い、キャッシュはその中核技術の 1 つになりました。キャッシュにより、ユーザーのアクセス速度が大幅に向上し、サーバーの負荷が軽減されます。キャッシュの削除はキャッシュ システムの重要な部分です。この記事では、Golang で優先順位に基づいたキャッシュ削除戦略を実装する方法を紹介します。

1. キャッシュ削除戦略とは

キャッシュ削除とは、キャッシュがいっぱいになったときに、新しいデータをキャッシュに保存するために、特定のルールに従って一部のキャッシュ データをクリアする必要があることを意味します。異なるキャッシュ削除戦略には、FIFO (先入れ先出し)、LRU (最も最近使用されていない)、LFU (最も最近使用されていない)、ランダム アルゴリズムなどの異なるルールがあります。

2. Golang での実装

Golang のマップは、キャッシュの実装に簡単に使用できます。以下は、マップを使用して Golang でキャッシュ削除戦略を実装する方法を簡単に紹介します。

  1. FIFO

FIFO は最も単純なキャッシュ削除戦略であり、データがキャッシュに入った順序でデータを 1 つずつクリアします。 Golang では、マップとリストを使用して FIFO を実装できます。 Map はキャッシュされたデータを格納するために使用され、list はデータの挿入順序を格納するために使用されます。キャッシュがいっぱいになると、最初に挿入されたデータをリストから見つけてマップとリストから消去します。

    #LRU
LRU は、最も最近使用されていない原則に基づいたキャッシュ削除戦略であり、一般に比較的優れた戦略であると考えられています。 Golang では、マップと二重リンク リスト (またはリスト) を使用して LRU を実装することもできます。マップはキャッシュされたデータを保存するために使用され、二重リンク リストはキャッシュされたデータが使用される順序を維持するために使用されます。キャッシュされたデータが使用される場合、そのデータはリンク リストの先頭に移動されます。キャッシュがいっぱいになると、リンク リストの末尾から最も古い未使用データが検索され、マップとリンク リストから消去されます。

    LFU
LFU は、最も使用されていない原則に基づいたキャッシュ削除戦略であり、シナリオによっては LRU よりも適切な場合があります。 Golang では、マップとヒープを使用して LFU を実装することもできます。マップはキャッシュ データを格納するために使用され、ヒープは使用状況によってソートされたキャッシュ データを維持するために使用されます。特定のキャッシュされたデータが使用されるとき、ヒープ内のそのノードを新しい使用カウントの位置に調整 (または再挿入) します。キャッシュがいっぱいになると、ヒープから最も使用されていないデータを見つけて、マップとヒープから消去します。

3. 優先度ベースのキャッシュ削除戦略

上で紹介した一般的なキャッシュ削除戦略に加えて、ビジネス シナリオに基づいてキャッシュ削除戦略をカスタマイズすることもできます。たとえば、シナリオによっては、特定の優先順位に基づいてどのデータを最初に保持するかを決定する必要があります。では、それを Golang で実装するにはどうすればよいでしょうか?

優先度ベースのキャッシュ削除戦略は、マップとヒープを組み合わせて実装できます。マップはキャッシュされたデータを保存するために使用され、ヒープは優先度によってソートされたキャッシュされたデータを維持するために使用されます。優先度ベースのキャッシュ削除戦略を実装するには、キャッシュされたデータごとに優先度を定義する必要があります。これは、キャッシュされたデータに優先度属性を追加するか、データを構造体にカプセル化して優先度フィールドを追加することによって実現できます。

以下はサンプル コードです:

type CacheItem struct {
    Key       string
    Value     interface{}
    Priority  int64 // 优先级
    Timestamp int64
}

type PriorityQueue []*CacheItem

func (pq PriorityQueue) Len() int { return len(pq) }

func (pq PriorityQueue) Less(i, j int) bool {
    return pq[i].Priority > pq[j].Priority
}

func (pq PriorityQueue) Swap(i, j int) {
    pq[i], pq[j] = pq[j], pq[i]
}

func (pq *PriorityQueue) Push(x interface{}) {
    item := x.(*CacheItem)
    *pq = append(*pq, item)
}

func (pq *PriorityQueue) Pop() interface{} {
    old := *pq
    n := len(old)
    item := old[n-1]
    *pq = old[0 : n-1]
    return item
}

type Cache struct {
    data     map[string]*CacheItem
    priority *PriorityQueue
    cap      int
    expire   time.Duration // 过期时间
}
ログイン後にコピー

上記のコードでは、CacheItem と PriorityQueue を定義します。 CacheItem はキャッシュ内のデータ項目を表します。これには、Key、Value、Priority、Timestamp の 4 つの属性が含まれます。 PriorityQueue は、heap.Interface インターフェイスを実装する構造体であり、優先度によってソートされたキャッシュ データを維持するために使用されます。

次に、データ、優先度、上限、有効期限などのいくつかの属性を含むキャッシュ構造を定義します。 data はキャッシュされたデータを保存するために使用され、priority はデータの優先順位を維持するために使用され、cap はキャッシュ容量を表し、expired はキャッシュされたデータの有効期限を表します。

以下は、優先度に基づいてキャッシュ データを削除するサンプル コードです。

func (cache *Cache) Set(key string, value interface{}, priority int64) {
    item := &CacheItem{
        Key:      key,
        Value:    value,
        Priority: priority,
        Timestamp: time.Now().UnixNano(),
    }
    cache.data[key] = item
    heap.Push(cache.priority, item)

    // 进行缓存淘汰
    if len(cache.data) > cache.cap {
        for {
            item := heap.Pop(cache.priority).(*CacheItem)
            if _, ok := cache.data[item.Key]; ok {
                delete(cache.data, item.Key)
                break
            }
        }
    }
}

func (cache *Cache) Get(key string) interface{} {
    item, ok := cache.data[key]
    if !ok {
        return nil
    }
    // 更新优先级
    item.Priority += 1
    item.Timestamp = time.Now().UnixNano()
    heap.Fix(cache.priority, item.Index)
    return item.Value
}
ログイン後にコピー

Set メソッドでは、キャッシュ データをマップと優先度に挿入し、同時にキャッシュの削除を実行します。時間。キャッシュがいっぱいになると、heap.Pop を通じて最も優先度の低いデータを見つけて、マップと優先度からクリアします。

Get メソッドでは、マップを通じてデータを検索し、その優先度を 1 つ増やし、同時にタイムスタンプを更新します。次に、heap.Fix を通じて優先順位の位置を調整します。

4. 概要

この記事では、Golang での 3 つの一般的なキャッシュ削除戦略 (FIFO、LRU、LFU) の実装と、優先度ベースのキャッシュ削除戦略のサンプル コードを紹介します。 。実際のシナリオでは、さまざまなキャッシュ戦略がさまざまなアプリケーション シナリオに適しており、ビジネス ニーズに応じて選択する必要があります。同時に、キャッシュを使用する場合は、キャッシュ容量や有効期限など、いくつかの詳細を考慮する必要があります。

以上がGolang で優先順位に基づいたキャッシュ削除戦略を実装します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート