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