Go 言語での同時キャッシュ アクセスの問題を解決するにはどうすればよいですか?
同時プログラミングでは、キャッシュが一般的に使用される最適化戦略です。データをキャッシュすることにより、基盤となるストレージへの頻繁なアクセスが軽減され、システムのパフォーマンスが向上します。ただし、複数の同時アクセスのシナリオでは、キャッシュの競合やキャッシュの侵入など、同時キャッシュ アクセスの問題が頻繁に発生します。この記事では、Go言語での同時キャッシュアクセスの問題を解決する方法と具体的なコード例を紹介します。
package main import ( "fmt" "sync" ) var cache map[string]string var mutex sync.Mutex func main() { cache = make(map[string]string) var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func(index int) { defer wg.Done() key := fmt.Sprintf("key-%d", index) value, ok := getFromCache(key) if ok { fmt.Printf("Read from cache: %s -> %s ", key, value) } else { value = expensiveCalculation(key) setToCache(key, value) fmt.Printf("Write to cache: %s -> %s ", key, value) } }(i) } wg.Wait() } func getFromCache(key string) (string, bool) { mutex.Lock() defer mutex.Unlock() value, ok := cache[key] return value, ok } func setToCache(key string, value string) { mutex.Lock() defer mutex.Unlock() cache[key] = value } func expensiveCalculation(key string) string { // 模拟耗时操作 return fmt.Sprintf("value-%s", key) }
上記のコードでは、getFromCache
と # の前後にあります。 ##setToCache 操作 ミューテックス ロックを追加すると、1 つのスレッドだけが同時にキャッシュの読み取りと書き込みを行えるようになり、同時キャッシュ アクセスの問題が解決されます。
package main import ( "fmt" "sync" ) var cache map[string]string var rwmutex sync.RWMutex func main() { cache = make(map[string]string) var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func(index int) { defer wg.Done() key := fmt.Sprintf("key-%d", index) value, ok := getFromCache(key) if ok { fmt.Printf("Read from cache: %s -> %s ", key, value) } else { value = expensiveCalculation(key) setToCache(key, value) fmt.Printf("Write to cache: %s -> %s ", key, value) } }(i) } wg.Wait() } func getFromCache(key string) (string, bool) { rwmutex.RLock() defer rwmutex.RUnlock() value, ok := cache[key] return value, ok } func setToCache(key string, value string) { rwmutex.Lock() defer rwmutex.Unlock() cache[key] = value } func expensiveCalculation(key string) string { // 模拟耗时操作 return fmt.Sprintf("value-%s", key) }
sync.RWMutex を使用しています。読み取り操作の前後に読み取りロック
RLock が追加され、書き込み操作の前後に書き込みロック
Lock が追加されるため、複数のスレッドがキャッシュを読み取ることができるようになります。ただし、書き込み操作を実行できるスレッドは 1 つだけなので、同時実行パフォーマンスが向上します。
以上がGo言語での同時キャッシュアクセスの問題を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。