Go での同時マップ アクセスに苦労したことはありませんか?あなたは一人ではありません! sync.Map は Go に組み込まれていますが、場合によっては、より強力なものが必要になります。 GoFrame フレームワークから gmap を入力します。これは、まさにあなたが探しているものかもしれない、高性能の同時安全マップです。
この記事では、以下について説明します。
飛び込んでみましょう! ?♂️
gmap は、GoFrame によって提供される同時実行性の高いマップ実装であり、同時実行性の高いシナリオ向けに特別に設計されています。共有マップ上で多数の同時読み取り/書き込み操作を処理する必要があるアプリケーションを構築している場合、これは注目に値します。
まず、gmap を立ち上げて実行する方法を見てみましょう:
import "github.com/gogf/gf/v2/container/gmap" func main() { m := gmap.New() // Set some values m.Set("hello", "world") m.Set("foo", "bar") // Get values safely fmt.Println(m.Get("hello")) // Output: world }
非常に簡単ですよね?しかし、待ってください、まだあります! ?
gmap には便利な操作が満載です。おそらく頻繁に使用するものを以下に示します:
// Batch set multiple values m.Sets(g.MapAnyAny{ "key1": "value1", "key2": "value2", }) // Check if a key exists if m.Contains("key1") { fmt.Println("Found it!") } // Remove a key m.Remove("key1") // Get the map size size := m.Size() // Clear everything m.Clear() // Iterate over all items m.Iterator(func(k interface{}, v interface{}) bool { fmt.Printf("%v: %v\n", k, v) return true })
実際の例を見てみましょう。 gmap を使用して単純なキャッシュ レイヤーを作成する方法は次のとおりです:
func Cache(key string) (interface{}, error) { data := gmap.New() // Try cache first if cached := data.Get(key); cached != nil { return cached, nil } // Cache miss - get from database result := db.GetSomething(key) if result != nil { data.Set(key, result) } return result, nil }
ここからは興味深い部分です - gmap は Go の組み込み sync.Map とどのように比較できるのでしょうか?いくつかのシナリオを見てみましょう。
これは、ハイキーの衝突をシミュレートするベンチマークです:
func BenchmarkKeyConflict(b *testing.B) { m1 := gmap.New() m2 := sync.Map{} b.RunParallel(func(pb *testing.PB) { for pb.Next() { key := rand.Intn(10) // Limited key range m1.Set(key, key) m2.Store(key, key) } }) }
結果は? gmap は約 3 倍高速です。 ?これは、ロックの競合を軽減するスマートなシャーディング設計のおかげです。
私が苦労して学んだことをいくつか紹介しますので、あなたはそうする必要はありません:
メモリ使用量: gmap は同時実行安全設計のため、通常のマップよりも多くのメモリを使用します。小さなマップまたは同時実行性の低いシナリオの場合は、通常のマップを使用してください。
キーの種類: キーは同等である必要があります (== と != をサポート)。カスタム型の場合は、Hash() メソッドと Equal() メソッドを実装する必要があります。
イテレーターの動作: イテレーターはスナップショットを取得するため、反復中の変更は次の反復まで表示されません。
// Example of iterator behavior m := gmap.New() m.Set("key1", "value1") go func() { time.Sleep(time.Millisecond) m.Set("key2", "value2") // Won't be seen in current iteration }() m.Iterator(func(k, v interface{}) bool { fmt.Printf("%v: %v\n", k, v) return true })
gmap は次の場合に点灯します。
gmap は、Go 開発者ツールキットの強力なツールです。これは万能のソリューションではありませんが、適切なシナリオでパフォーマンスを大幅に向上させることができます。
覚えておいてください:
プロジェクトで gmap を使用したことがありますか?コメントであなたの経験について聞きたいです! ?
コーディングを楽しんでください! ?
以上がGoFrame の gmap: 高性能同時マップの詳細の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。