Goにおける同時ネットワークリクエストのキャッシュ化と無効化
リクエストキャッシュとキャッシュアップデートの問題を Go 言語で解決するには、sync.Map が使用できます。
最初に、リクエスト済みの URL とそれらのレスポンスを格納するためのキャッシュとして、グローバルな sync.Map を作成します。sync.Map は Go 言語によって提供されている、並行化セーフなマップです。
var cache sync.Map
リクエストが届いたら、まずはキャッシュの中にそのURLに対するレスポンスデータがあるかどうかを確認する。あれば、キャッシュのデータをそのまま返す。なければ、ネットワークリクエストを行って、レスポンスデータをキャッシュに格納する。
func handleRequest(url string) {
// 检查缓存
if response, ok := cache.Load(url); ok {
// 直接返回缓存的数据
fmt.Println("Cache hit:", response)
return
}
// 进行网络请求
resp, err := http.Get(url)
if err != nil {
fmt.Println("Failed to make request:", err)
return
}
// 读取响应数据
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Failed to read response body:", err)
return
}
// 存入缓存
cache.Store(url, string(body))
// 关闭响应体
resp.Body.Close()
fmt.Println("Cache miss:", string(body))
}
キャッシュの更新が必要な場合は、sync.MapのStoreメソッドを使用することでキャッシュ内のデータを更新できます。
func updateCache(url string, data string) {
// 更新缓存
cache.Store(url, data)
}
sync.Map のデータアクセス手段は Load と Store であり、通常のマップの読み書き操作ではない点に注意してください。
以上は、並行するネットワーク要求の要求キャッシュとキャッシュ更新問題に対する、簡単な実装の方法です。実際のニーズに基づいて、キャッシュの有効期限の設定や、LRU アルゴリズムを使用したキャッシュの削除など、キャッシュメカニズムをさらに最適化および拡張することができます。