キャッシュ破壊防止ツールsinglefight解読
2240 ワード
キャッシュブレークダウン
キャッシュブレークスルーとは、キャッシュ内のキーが期限切れになると、このデータの大量の同時要求がキャッシュが再生成されない場合にデータベースに要求されることを意味します.データベースのクラッシュを引き起こす.
ソリューション
大量の同時要求は1つのデータであり、1つの要求がデータベースに到着してキャッシュを設定するだけでよい.したがって,他のリクエストなどのキャッシュ生成を制御してから続行する必要がある.
singleflight
singleflightはgroupCacheのツールです.その役割は次のとおりです.
Package singleflight provides a duplicate function call suppression mechanism.
パッケージsingleflightは、重複する関数呼び出し抑制メカニズムを提供します.すなわちsingleflightは、複数の同じ関数呼び出しを実際に1回だけ実行し、最初の実行結果を他の呼び出しに直接割り当てることができる.
コード#コード#
singleflightコードは全部で100行以上しかありません
// Copyright 2013 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package singleflight provides a duplicate function call suppression
// mechanism.
package singleflight // import "golang.org/x/sync/singleflight"
import "sync"
// call is an in-flight or completed singleflight.Do call
type call struct {
wg sync.WaitGroup
// These fields are written once before the WaitGroup is done
// and are only read after the WaitGroup is done.
val interface{}
err error
// forgotten indicates whether Forget was called with this call's key
// while the call was still in flight.
forgotten bool
// These fields are read and written with the singleflight
// mutex held before the WaitGroup is done, and are read but
// not written after the WaitGroup is done.
dups int
chans []chan 0
}
// DoChan is like Do but returns a channel that will receive the
// results when they are ready.
func (g *Group) DoChan(key string, fn func() (interface{}, error)) 0}
}
g.mu.Unlock()
}
// Forget tells the singleflight to forget about a key. Future calls
// to Do for this key will call the function rather than waiting for
// an earlier call to complete.
func (g *Group) Forget(key string) {
g.mu.Lock()
if c, ok := g.m[key]; ok {
c.forgotten = true
}
delete(g.m, key)
g.mu.Unlock()
}
考え方はsingleflightを使用して関数呼び出しを行うたびに、Groupに登録されている同じ呼び出しがあるかどうかを確認することです.ある場合は呼び出しが完了するまで待機し、その結果を返します.ない場合は、1つを登録し、関数を実行します.実行が完了すると、登録した呼び出しを削除します.