ホームページ  >  記事  >  バックエンド開発  >  キャッシュ実装 golang

キャッシュ実装 golang

WBOY
WBOYオリジナル
2023-05-21 19:58:06469ブラウズ

Web サイトまたはアプリケーションの開発中、ページにはロードする必要があるさまざまなデータやリソースが含まれる場合があり、それらの一部は頻繁にリクエストされます。この場合、リクエストのたびにデータベースにクエリを実行したり、リソースを再取得したりすると、Web サイトまたはアプリケーションの応答が遅くなる可能性があります。この問題を解決するには、キャッシュ テクノロジを使用できます。この記事では、Golang でキャッシュを実装する方法を紹介します。

Golang でのキャッシュ

Golang には「sync」と呼ばれるパッケージがあり、これには「Map」タイプのマップ同時実行安全実装が含まれています。このマップを使用して、キャッシュ機能を実装できます。

Golang でキャッシュを実装するための基本的な手順は次のとおりです。

  1. グローバル変数を定義する

キャッシュされたデータを保存するグローバル Map 変数を定義できます。データ 。このマップでは、文字列を「キー」として使用し、任意のタイプの変数を「値」として使用できます。

var cache = struct {
    sync.RWMutex
    items map[string]interface{}
}{
    items: make(map[string]interface{}),
}

上記のコードでは、キャッシュ操作がスレッドセーフであることを保証するために sync.RWMutex 構造体が使用されています。同時に、make 関数を使用して空のマップを作成します。

  1. データをキャッシュに追加する
func Set(key string, value interface{}, exp time.Duration) {
    cache.Lock()
    defer cache.Unlock()
    cache.items[key] = value
    if exp > 0 {
        time.AfterFunc(exp, func() {
            expire(key)
        })
    }
}

上記のコードでは、「Lock」メソッドを使用して、複数のゴルーチンがキャッシュにアクセスしても安全であることを確認します。同時 。その後、キーと値のペアをキャッシュに追加しました。ここで、「キー」はキャッシュされたキー、「値」はキャッシュされた値です。最後に、「time.AfterFunc」関数を使用してキャッシュ時間を設定します。キャッシュの有効期限が切れると、「expire」メソッドが自動的に呼び出され、キャッシュが削除されます。

  1. キャッシュからデータを読み取る
func Get(key string) (interface{}, bool) {
    cache.RLock()
    defer cache.RUnlock()
    val, ok := cache.items[key]
    return val, ok
}

上記のコードでは、「RLock」メソッドを使用してキャッシュをロックし、複数のゴルーチンが同時にキャッシュにアクセスできるようにします。自由に読むことができます。その後、対応するキーと値のペアをキャッシュから取得します。 「val」は取得された値、「ok」はキャッシュが正常に取得されたかどうかを示します。

  1. キャッシュからデータを削除する
func Delete(key string) {
    cache.Lock()
    defer cache.Unlock()
    delete(cache.items, key)
}

上記のコードでは、「Lock」メソッドを使用して、同時にアクセスする複数の goroutine に対してキャッシュが安全であることを確認します。次に、キャッシュ内の対応するキーと値のペアを削除します。

サンプル コード

上記の手順に従って、単純なキャッシュ実装を作成できます。コードは次のとおりです。

package main

import (
    "fmt"
    "sync"
    "time"
)

var cache = struct {
    sync.RWMutex
    items map[string]interface{}
}{
    items: make(map[string]interface{}),
}

func Set(key string, value interface{}, exp time.Duration) {
    cache.Lock()
    defer cache.Unlock()
    cache.items[key] = value
    if exp > 0 {
        time.AfterFunc(exp, func() {
            expire(key)
        })
    }
}

func Get(key string) (interface{}, bool) {
    cache.RLock()
    defer cache.RUnlock()
    val, ok := cache.items[key]
    return val, ok
}

func Delete(key string) {
    cache.Lock()
    defer cache.Unlock()
    delete(cache.items, key)
}

func expire(key string) {
    cache.Lock()
    defer cache.Unlock()
    delete(cache.items, key)
}

func main() {
    Set("key", "value", time.Second*10)

    val, ok := Get("key")
    if ok {
        fmt.Println(val)
    } else {
        fmt.Println("Value not found")
    }

    Delete("key")
}

上記の例では、Set を使用します。キャッシュするメソッド キーと値のペアを追加し、キャッシュ時間を設定します。次に、Get メソッドを使用して、保存されている値をキャッシュから読み取ります。最後に、Delete メソッドを使用して、保存されているキーと値のペアを削除します。

結論

この記事では、Sync パッケージを使用して Golang でキャッシュを実装する方法を紹介しました。この方法を使用すると、データの操作効率が向上し、不要なデータベース クエリが削減されます。この記事が、Golang でのキャッシュの実装方法をより深く理解するのに役立つことを願っています。

以上がキャッシュ実装 golangの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。