ホームページ >バックエンド開発 >Golang >Golang のキャッシュが無効になった場合はどうすればよいですか?

Golang のキャッシュが無効になった場合はどうすればよいですか?

WBOY
WBOYオリジナル
2024-06-02 17:09:02671ブラウズ

Golang でキャッシュの無効化に対処する場合、次の戦略に従うことができます。キャッシュ項目にタイムスタンプをマークし、期限切れになったら新しいデータを取得します。ロックを使用すると、コルーチンがキャッシュ項目を取得するとキャッシュがロックされ、キャッシュ項目が存在しないか期限切れになるとキャッシュのロックが解除されて新しいデータが取得されます。

如何处理 Golang 缓存失效的情况?

Golang のキャッシュ障害に対処するにはどうすればよいですか?

Golang プログラムでキャッシュを使用する場合、データの一貫性と信頼性を確保するためにキャッシュの障害に対処することが重要です。以下に 2 つの処理戦略があります:

1. タイムスタンプ

  • を使用して、キャッシュ項目をタイムスタンプに関連付けます。
  • キャッシュアイテムの有効期限が切れたら、新しいデータを取得してキャッシュを更新します。
type CacheItem struct {
    Value interface{}
    Timestamp time.Time
}

var cache = make(map[string]CacheItem)

func SetCache(key string, value interface{}) {
    cache[key] = CacheItem{Value: value, Timestamp: time.Now()}
}

func GetCache(key string) (interface{}, bool) {
    item, ok := cache[key]
    if ok && time.Since(item.Timestamp) < time.Second*30 {
        return item.Value, true
    }
    return nil, false
}

2. ロックを使用する

  • コルーチンがキャッシュ項目を取得するときに、キャッシュをロックします。
  • キャッシュ項目が存在しないか期限切れの場合は、キャッシュのロックを解除して新しいデータを取得します。
var cache = sync.Map{}

func SetCache(key string, value interface{}) {
    cache.Store(key, value)
}

func GetCache(key string) (interface{}, bool) {
    if value, ok := cache.Load(key); ok {
        return value, true
    }

    lock := sync.Mutex{}
    lock.Lock()
    defer lock.Unlock()

    if value, ok := cache.Load(key); ok {
        return value, true
    }

    newValue, err := fetchNewValue(key)
    if err == nil {
        cache.Store(key, newValue)
    }

    return newValue, err == nil
}

実際的なケース

RESTful API でキャッシュを使用してユーザーの詳細を保存していると仮定します。

りー

以上がGolang のキャッシュが無効になった場合はどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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