Vous êtes-vous déjà retrouvé aux prises avec un accès simultané à la carte dans Go ? Vous n'êtes pas seul ! Bien que sync.Map soit intégré à Go, nous avons parfois besoin de quelque chose de plus puissant. Entrez gmap à partir du framework GoFrame - une carte sécurisée hautes performances qui pourrait bien être ce que vous recherchez.
Dans cet article, nous explorerons :
Plongeons-nous ! ?♂️
gmap est une implémentation de carte sécurisée fournie par GoFrame et spécialement conçue pour les scénarios à forte concurrence. Si vous créez des applications qui doivent gérer de nombreuses opérations de lecture/écriture simultanées sur des cartes partagées, cela mérite votre attention.
Tout d'abord, voyons comment être opérationnel avec 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 }
Assez simple, non ? Mais attendez, il y a plus ! ?
gmap est livré avec de nombreuses opérations utiles. En voici quelques-uns que vous utiliserez probablement souvent :
// 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 })
Regardons un exemple pratique. Voici comment utiliser gmap pour créer une simple couche de mise en cache :
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 }
Maintenant, passons à la partie passionnante : comment gmap se compare-t-il au sync.Map intégré de Go ? Regardons quelques scénarios.
Voici un benchmark qui simule une collision avec des touches hautes :
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) } }) }
Résultats ? gmap est environ 3 fois plus rapide ! ? C'est grâce à sa conception de partage intelligente qui réduit les conflits de verrouillage.
Voici quelques choses que j'ai apprises à mes dépens pour que vous n'ayez pas à le faire :
Utilisation de la mémoire : gmap utilise plus de mémoire que les cartes classiques en raison de sa conception sécurisée. Pour les petites cartes ou les scénarios à faible concurrence, restez fidèle aux cartes classiques.
Types de clés : Vos clés doivent être comparables (support == et !=). Pour les types personnalisés, vous devrez implémenter les méthodes Hash() et Equal().
Comportement de l'itérateur : l'itérateur prend un instantané, donc les modifications au cours de l'itération ne seront visibles qu'à l'itération suivante.
// 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 brille quand :
gmap est un outil puissant dans la boîte à outils du développeur Go. Bien qu'il ne s'agisse pas d'une solution universelle, elle peut améliorer considérablement les performances dans les bons scénarios.
Rappelez-vous :
Avez-vous utilisé gmap dans vos projets ? J'aimerais entendre parler de vos expériences dans les commentaires ! ?
Bon codage ! ?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!