キャッシュは一般的なパフォーマンス最適化手法です。現代のコンピューター システムでは、アクセスを高速化するために、頻繁に使用されるデータをメモリに保存することがよくあります。 Web アプリケーションでは、キャッシュ メカニズムによりデータベースへの負荷が軽減され、アプリケーションの応答速度が向上します。
Golang は優れた同時実行メカニズムとメモリ管理モデルを提供するため、高パフォーマンスのキャッシュ システムの実装に非常に適しています。この記事では、Golang を使用して簡単なキャッシュ システムを構築する方法を学びます。
最も単純なキャッシュ システムは、データをマップに保存します。 Map は Golang の最も重要な組み込みデータ構造の 1 つであり、高速なクエリ操作を提供します。マップはキーと値のペアのコレクションと考えることができます。キーは一意であり、各値に対応します。
次のコードを使用してマップを作成できます:
cache := make(map[string]string)
次に、データをマップに追加できます:
cache["key"] = "value"
次に、次のコードに従って値をクエリできます。 key:
val, ok := cache["key"] if ok { fmt.Println(val) }
map を使用して、データベースから取得したデータを保存する単純なキャッシュ システムを実装できます。データベースのクエリにはある程度の時間がかかるため、データをマップに保存することで、データベースへのクエリを繰り返し実行することを避けることができます。このようにして、キャッシュを使用してアプリケーションのパフォーマンスを向上させることができます。
マップとミューテックスを使用して、基本的なキャッシュ システムを実装できます。ミューテックスを使用して同時実行制御を実装すると、複数のゴルーチンが同時にマップにアクセスする問題を回避できます。具体的な実装は次のとおりです。
type Cache struct { items map[string]string sync.Mutex } func (c *Cache) Set(key, val string) { c.Lock() defer c.Unlock() c.items[key] = val } func (c *Cache) Get(key string) (string, bool) { c.Lock() defer c.Unlock() val, ok := c.items[key] return val, ok }
このキャッシュ システムでは、すべてのキャッシュ アイテムを保存する構造体 Cache を定義します。 items は、データ項目を格納するために使用されるマップです。また、キャッシュ項目をそれぞれ設定および取得するための 2 つのメソッド Set および Get も定義します。どちらのメソッドもミューテックスを使用してスレッドの安全性を確保します。
実際のアプリケーションでは、通常、有効期限ポリシーを定義する必要があります。有効期限ポリシーを使用しないと、キャッシュ内の期限切れのデータ項目を定期的に削除できません。したがって、キャッシュ システムのパフォーマンスが悪影響を受けます。 Golang では、time パッケージの Time タイプを使用して、キャッシュ項目の有効期限を計算できます。
まず、Cache 構造に、各キャッシュ項目の有効期限を指定するために、expires フィールドを追加する必要があります。
type cacheItem struct { value string expireAt time.Time } type Cache struct { items map[string]cacheItem sync.Mutex }
次に、Get メソッドで、キャッシュを確認する必要があります。アイテムの有効期限が切れていませんか?有効期限が切れた場合は、削除して false を返します:
func (c *Cache) Get(key string) (string, bool) { c.Lock() defer c.Unlock() item, ok := c.items[key] if !ok { return "", false } if item.expireAt.Before(time.Now()) { delete(c.items, key) return "", false } return item.value, true }
同時に、期限切れのキャッシュ アイテムを定期的に削除するメソッドも追加する必要があります:
func (c *Cache) cleanUp() { for { time.Sleep(time.Minute) c.Lock() for key, item := range c.items { if item.expireAt.Before(time.Now()) { delete(c.items, key) } } c.Unlock() } }
このメソッドはスリープを使用して、キャッシュアイテムの有効期限が切れているかどうかを定期的に確認し、期限切れのキャッシュアイテムを削除します。
この記事では、Golang を使用してシンプルなキャッシュ システムを構築する方法を学びました。マップとミューテックスを使用してデータ ストレージと同時実行制御を実装し、time パッケージの Time タイプを使用して有効期限を指定します。 Get メソッドで期限切れのキャッシュ項目の定期的なクリーニングを実装することで、キャッシュ システムのパフォーマンス低下の問題を回避します。この単純なキャッシュ システムを拡張して、アプリケーションのパフォーマンスとスケーラビリティを向上させることができます。
以上がGolang で簡単なキャッシュ システムを構築する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。