Golang 関数のキャッシュ障害のシナリオと処理戦略

WBOY
リリース: 2024-05-05 08:00:02
オリジナル
271 人が閲覧しました

Go 言語では、関数キャッシュの失敗シナリオには、パラメーターの変更、グローバル変数の変更、プログラムの再デプロイメント、および同時変更が含まれます。処理戦略には次のものが含まれます。 1. 遅延計算 (計算を実行して結果をキャッシュするための最初の呼び出し) 2. 有効期限戦略 (キャッシュされた結果の有効性を定期的にチェックする) 3. 通知メカニズム (キャッシュを自動的に無効にするイベントまたはメッセージをサブスクライブします)。 ); 4. 無効化シナリオを除外します (コード ロジックを変更するか、他のテクノロジを導入します)。実際のケース: 電子商取引 Web サイトは、商品の価格を取得する機能を使用し、有効期限戦略を使用して価格の変更を定期的に確認し、ロック メカニズムを使用して同時変更を防止できます。

Golang 関数のキャッシュ障害のシナリオと処理戦略

Go 言語の関数キャッシュの失敗シナリオと処理戦略

Go 言語では、関数のキャッシュによってコードのパフォーマンスが大幅に向上します。完璧ではありません。関数キャッシュの無効化は避けられません。この記事では、一般的な無効化シナリオとその処理戦略を紹介します。

無効化シナリオ

  • パラメータの変更: 関数キャッシュは関数パラメータに依存します。パラメータが変更されると、キャッシュは無効になります。
  • グローバル変数の変更: 関数が共有グローバル変数にアクセスし、その変数が変更されると、キャッシュは無効になります。
  • プログラムの再デプロイ: プログラムを再デプロイすると、すべての関数キャッシュが無効になります。
  • 同時変更: 同時環境では、同時に実行される複数のゴルーチンが共有データを同時に変更し、キャッシュ エラーを引き起こす可能性があります。

処理戦略

1. 遅延計算

遅延計算は、遅延計算戦略です。関数が初めて呼び出されたときに実行され、結果がキャッシュされると、呼び出しはキャッシュから直接結果を取得します。

import "sync"

var m sync.Map

func Fibonacci(n int) int {
    if n < 2 {
        return n
    }

    var result int
    val, exists := m.Load(n)
    if exists {
        result = val.(int)
    } else {
        result = Fibonacci(n-1) + Fibonacci(n-2)
        m.Store(n, result)
    }

    return result
}
ログイン後にコピー

2. 有効期限戦略

有効期限戦略は、キャッシュに保存された結果がまだ有効かどうかを定期的にチェックし、無効な場合はキャッシュから削除することです。キャッシュ。

import (
    "sync"
    "time"
)

type entry struct {
    value interface{}
    expiry time.Time
}

var cache = sync.Map{}

func SetWithExpiry(key, value interface{}, expiry time.Duration) {
    cache.Store(key, &entry{value: value, expiry: time.Now().Add(expiry)})
}

func Get(key interface{}) (interface{}, bool) {
    val, exists := cache.Load(key)
    if !exists {
        return nil, false
    }
    entry := val.(*entry)
    if entry.expiry.Before(time.Now()) {
        cache.Delete(key)
        return nil, false
    }
    return entry.value, true
}
ログイン後にコピー

3. 通知メカニズム

イベントまたはメッセージをサブスクライブすることで、関数キャッシュを自動的に無効にすることができ、関連するデータが変更されると、イベントまたはメッセージがトリガーされて通知されます。無効化のキャッシュ。

import (
    "context"
    "sync"
)

var results = sync.Map{}
var invalidations = make(chan struct{})

func Memoize(ctx context.Context, f func() (interface{}, error)) (interface{}, error) {
    key := f
    val, ok := results.Load(key)
    if ok {
        return val.(interface{}), nil
    }

    result, err := f()
    if err != nil {
        return nil, err
    }

    invalidations <- struct{}{} // 触发缓存失效
    results.Store(key, result)
    return result, nil
}
ログイン後にコピー

4. 障害シナリオを排除する

コード ロジックを変更するか、他のテクノロジを導入することで、障害シナリオを排除できる場合があります。たとえば、不変のデータ構造を使用したり、共有データへの同期アクセスを使用したりします。

実際的なケース

電子商取引 Web サイトにいて、製品の価格を取得する関数 GetProductPrice があるとします。製品の価格は頻繁に変更されるため、関数キャッシュを使用してパフォーマンスを最適化する必要があります。

import (
    "sync"
    "time"
)

type product struct {
    ID    int
    Price float64
}

var cache = sync.Map{}

// GetProductPrice 从缓存获取产品价格,如果缓存中没有,则从数据库中获取并缓存
func GetProductPrice(id int) (float64, error) {
    val, exists := cache.Load(id)
    if exists {
        return val.(float64), nil
    }

    product, err := getProductFromDatabase(id)
    if err != nil {
        return 0, err
    }

    cache.Store(id, product.Price)
    return product.Price, nil
}
ログイン後にコピー

製品の価格は定期的に変更されるため、有効期限ポリシーを使用してキャッシュを管理し、価格が変更されたかどうかを定期的に確認する必要があります。

rree

以上がGolang 関数のキャッシュ障害のシナリオと処理戦略の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!