はじめに
アプリケーション・システムに多数のユーザーがアクセスし、システムのTPSが急速に上昇した場合、データベースに直接データを照会します。
システムのパフォーマンスボトルネックに達すると、インターフェイスの応答が遅くなり、ユーザーエクスペリエンスが非常に悪くなります。
次に、技術的なアーキテクチャの観点から、キャッシュ技術を使ってシステムを最適化することを考えます。
- キャッシュは、最もコストがかからず、シンプルで効果的な技術的アーキテクチャ・ソリューションの1つです。
- キャッシュはシステムの負荷を減らすと同時に、データ拡散の効率を高めます。
キャッシュとその応用シナリオ
キャッシュ入門
コンピュータでは、キャッシュはデータのサブセットが保存される高速データ記憶層であり、通常はエフェメラルです。
これによって、データの一次保存場所にアクセスするよりも、後日このデータを再度要求する方が速くなります。
キャッシュによる検索または計算されたデータの効率的な再利用
キャッシュには3つのタイプがあります。
ハードウェアキャッシュ
これは、ハードドライブ、CPU
ハードディスク、CPU、外部インターフェイスの間の一時的なストレージとして機能します。
外部インターフェースは通常、ハードディスクまたはCPUとメモリの間にあります。
クライアント側キャッシュ
ユーザーエクスペリエンスを向上させ、サーバーへの負担を軽減するため、ユーザーがアクセスしたデータの一部はクライアント側でローカルにキャッシュされます。
一般的にブラウザのキャッシュやアプリのキャッシュを指します。
サーバーサイド・キャッシング
サーバーサイドキャッシングの目的はクライアントサイドキャッシングと同じですが、サーバーの視点から見たものです。
クライアントは、各リクエストサーバーに直接データベースに接続する場合は、クライアントの要求数は、データベース圧力は非常に大きくなりますとき
今回は、頻繁に要求されるデータをメモリに保存することができます。
データベースへの圧力を減らすことができるデータベースを介さずに、直接、返す時間にアクセスする要求がある場合
ハードウェア・キャッシングはハードウェア・レベルの最適化であり、クライアント・キャッシングとサーバー・キャッシングは技術的な最適化です。
キャッシュの本質は、接続を改善する手段として、スペースと時間を交換することです。インターフェイスの応答時間
バックエンド開発者として、サーバーサイドのキャッシュに重点を置いています。
アプリケーションシナリオ
キャッシュの一般的なアプリケーションシナリオ
並行性の高いクエリ、並行性の高い書き込み、ホットデータ、大規模オブジェクトの初期化
キャッシュを使用するメリット
アプリケーションパフォーマンスの向上
メモリはディスクよりもはるかに高速であるため、アプリケーションのアクセス速度が大幅に向上します。
データベースコストの削減
単一のキャッシュ・インスタンスで数十万QPSを提供できるため、多数のデータベース・インスタンスを置き換えて総所有コストを削減できます。
バックエンドの負荷軽減
データベースの負荷を軽減し、負荷によるパフォーマンスの低下や雪崩を防ぎます。
予測可能なパフォーマンス
現在、最も一般的なアプリケーションは、データベースに直接クエリする要求の数が多い場合、いくつかの要求の応答時間が遅くなり、その結果、予測不可能なインターフェイスのパフォーマンスが発生します。
この問題は、高スループットのメモリキャッシュを利用することで軽減できます。
データベースのホットスポットの排除
このため、データベース内にホットスポットができ、アクセスを高速化するために特別な手段で維持する必要があります。
キャッシュを使用する場合、ホットスポットのデータについて考える必要はありません。
読み取りスループットの向上
データベースよりもレイテンシーが低いことに加え、インメモリシステムはスループットが高い。
例えば、redisの単一のインスタンスは、100,000以上の読み取り要求を処理することができます。
一般的なキャッシュの種類
- メモリキャッシング
- 分散キャッシュ
- コンビナトリアルキャッシュ
キャッシュ機能
生存時間の設定
キャッシュには通常有効期限が必要で、それを過ぎると無効になります。
一般的な期限切れストラテジーは、時間指定、定期的、および不活性期限切れです。
限られたスペース
キャッシュには容量制限があり、制限を超えるとキャッシュデータの一部を削除する必要があります。
一般的な消去戦略は、FIFO、LRU、LFUです。
同時更新をサポート
キャッシュは同時読み書きをサポートする必要があります。
キャッシュを使用するアプリケーションの通常の処理の流れは、以下の3つのステップに分けられます。
- キャッシュに照会てデータが存在するかどうかを確認し、存在する場合はクライアントに直接応答します。
- そうでない場合は、データベースに照会ます。
- クライアントに応答する前に、照会されたデータをキャッシュに設定します。
キャッシュ侵入
データベースに存在しないデータを要求すると、各クエリがキャッシュをヒットできず、データベースのストレスを軽減する目的が果たせなくなります。
キャッシュ侵入
キャッシュが無効化されている間、大量の同一のリクエストがキャッシュを通過してデータベースにアクセスします。
キャッシュ雪崩
多数のキャッシュが同時に無効化されるため、キャッシュを経由してデータベースへのリクエストが大量に発生します。
一般的なメモリキャッシュの実装
Javaアプリケーションでは、4つの一般的なメモリベースのキャッシュ実装があります。
Javaコンテナ
JDKには、HashMap、ConcurrentHashMapといったMapコンテナクラスがあります。
グアバ・キャッシュ
GoogleはJava拡張ツールキットGuavaモジュールを提供し、コミュニティは活発です。 Spring5デフォルトのメモリキャッシングフレームワーク
イーキャッシュ
ヘビーウェイト・メモリー・キャッシュ , 2レベル・キャッシュのサポート , Hibernateデフォルト・キャッシュ・フレームワーク
カフェイン
高性能メモリキャッシュのGuava APIベースの開発 , Spring5デフォルトのメモリキャッシュフレームワーク
まとめ
キャッシュの役割を要約すると、データベースへの負担を減らし、アプリケーションのパフォーマンスを向上させることです。
キャッシュは有効期限や消去ポリシーによって特徴付けられます。
キャッシュを使用する過程で、キャッシュの浸透、キャッシュヒット、キャッシュ雪崩の問題に遭遇することがあります。
メモリキャッシュの実装はどのようにしているのですか?
この記事に関するこれらの疑問点については、後日、以下のような知識も含めて詳しく紹介します。
- シンプルなメモリーキャッシングツールの手書き
- 一般的なメモリ・キャッシング・フレームワークの紹介と使用法
- ソースコードレベルでのCaffeine実装の分析
- キャッシュ侵入、キャッシュヒット、キャッシュ雪崩の対策
- メモリフレームワークの設計と実装