キャッシュの意味
キャッシュは、頻繁にアクセスされるデータの再利用可能なコピーをメモリに保持するため、アプリケーションはデータベース呼び出しを繰り返すことなく、よりすばやく結果を返せます。
キャッシュは、頻繁にアクセスされるデータの再利用可能なコピーをメモリに保持するため、アプリケーションはデータベース呼び出しを繰り返すことなく、よりすばやく結果を返せます。
キャッシュは、キーと値のデータをメモリに保存する手法です (非リレーショナルな構造化クエリ言語 (NoSQL) データベースなど)。これにより、アプリケーションは従来のストレージよりもすばやくデータを取得できます。クラウド ストレージ アーキテクチャでは、要求がネットワークをまたぎ、共有サービスにアクセスすることが多いため、キャッシュは応答時間を短く保ち、繰り返しの処理を減らすのに役立ちます。
多くのシステムでは、完全なデータセットのために永続的な「正本」 (データベース) を保持し、さらに頻繁に読み取られる一時的なサブセットのためにキャッシュを保持します。要求が届くと、アプリはまずキャッシュを確認します。データがあれば、バックエンドを再度クエリせずにすぐに返します。開発者は処理済みデータもキャッシュし、標準的なクエリよりも高速に要求を処理するためにそのデータを再利用します。対象はリレーショナル データベース、SQL データベース、またはオープン ソースの PostgreSQL データベースです。
適した候補は、繰り返し読み取られるデータと、変更頻度の低いデータです (たとえば、製品情報や価格情報、または作成コストの高い共有静的リソースなど)。
操作でデータを変換したり、複雑な計算を実行したりする場合は、結果をキャッシュしておくことで、後続の要求で再計算するのを避けられます。
開発者は、複数レベルのキャッシュ ("キャッシュ レイヤー") を使用して、需要に応じて異なる種類のデータを別々のキャッシュに保存します。キャッシュ レイヤーを 1 つ以上追加すると、データ レイヤーのスループットと待機時間を改善できます。
インメモリ ストアは多くの場合、ユーザー入力、ショッピング カートのエントリ、個人用設定など、大量のセッション データを短期間保持するために使われます。ステートフル アプリでは、アプリをステートレスにできるように、チームはセッション状態もキャッシュに保存します。
キャッシュは、いくつかの具体的な方法でパフォーマンスを向上させることができます:
システムによっては、マルチレベル キャッシュ (“キャッシュ レイヤー”) を使用して、需要に応じて異なる種類のデータを別々のキャッシュに配置します。キャッシュ レイヤーを 1 つ以上追加すると、データ レイヤーのスループットと待機時間が改善され、バックエンドの負荷が減ることで全体のコストが削減されます。
通常、チームはいくつかの種類に分類されるデータをキャッシュします:
アプリがキャッシュに対して読み取りおよび書き込みする標準的な方法はいくつかあります。ここでは、最も一般的なパターンと、実際にどのような意味を持つのかを示します。
キャッシュ レイヤーを使用すると、バックエンド ストアに繰り返しクエリする代わりに、一般的な要求をキャッシュから処理することで、スループットと待機時間を向上させることができます。これにより、第一にデータベースに到達する要求数が少なくなるため、データベース インフラストラクチャをスケーリングする必要性を低減できます。
使用量が急増するアプリでは、インメモリ キャッシュを使うと、頻繁に要求されるデータを使用場所の近くに保持するため、待機時間の軽減に役立ちます。
ワークフローを選ぶときは、次を出発点として使用します:
インメモリ キャッシュからの読み取りはディスクドリブン データ ストアからの読み取りより高速なため、キャッシュを使うとアプリケーションのパフォーマンスが向上します。より多くの要求がキャッシュから処理されると、システムがバックエンド データベースに送信するクエリが減り、データベース インフラストラクチャをスケーリングする必要性が減り、関連コストを低減できます。
キャッシュは、繰り返される作業を減らすのに役立ちます。繰り返し読み取られるデータ、または作成コストの高いデータは、一度保存して再利用できます。操作で複雑な計算を実行したりデータを変換したりする場合、結果をキャッシュすると、後続の要求で繰り返される計算が削減されます。
多くのサイトはページ出力 (HTML やクライアント スクリプトなど) をキャッシュするので、サーバーは、ページ コードを毎回再実行する代わりに、キャッシュされた出力を返すことができます。キャッシュは、コンテンツ配信ネットワーク (CDN) などの Web キャッシュやネットワーク キャッシュを通じて、Web マルチメディア シナリオもサポートします。
アプリは通常、すばやく取得するために一時的なデータのサブセットをキャッシュに保存する一方、プライマリ データベースが完全で永続的なデータセットを保持します。処理済みデータをキャッシュして再利用すると、標準的なデータベース クエリよりも迅速に要求を処理できます。
チームは通常、1 つ以上のキャッシュ レイヤーを追加してスループットと待機時間を改善し、一般的なクエリをキャッシュから処理してデータベースの負荷を削減します。使用量が急増し、スループット需要が高まるときは、インメモリ キャッシュを使うと、その期間の待機時間を軽減するのに役立ちます。
キャッシュは多くの場合、大量で有効期間の短いセッション データ (ユーザー入力や個人用設定など) を、インメモリ ストアに保存するために使われます。チームによっては、ステートフル アプリがアプリ層をステートレスに保持できるように、セッション状態もキャッシュに保存します。運用システムでは、変更頻度の低いデータ (製品情報や価格情報など) が一般的なキャッシュ対象です。
ブラウザー キャッシュは、静的リソースのコピーをユーザーのデバイスに保存するため、繰り返しアクセスしても静的リソースを再度ダウンロードする代わりに、それらのファイルを再利用できます。
サーバー側のキャッシュは、エンド ユーザーのデバイスではなく、リモートでビジネス サービスを実行するプロセス内で発生します。サーバー側キャッシュは、多くの場合、プライベート (1 つのアプリ インスタンスにローカル) または共有 (多数のアプリ インスタンスによって使用) のいずれかです。
CDN はエッジ サーバー上でエンド ユーザーの近くににコンテンツをキャッシュするため、要求は常に元のサーバーに戻るとは限りません。ブラウザー キャッシュ (1 人のユーザー) とは異なり、CDN キャッシュは共有されます。1 人のユーザーの要求によって、後で別のユーザーが受け取るコンテンツを事前設定することができます。
キャッシュはクラウド コンピューティングのパターンだけではなく、ハードウェア レイヤーやメモリ レイヤーでも使用されます。
CPU キャッシュは、プロセッサの近く(またはその上) にある小さい高速メモリ領域で、頻繁に使われるデータや命令のコピーを保存し、メイン メモリの待ち時間を短縮します。
メモリ (インメモリ) キャッシュは、最も単純なソフトウェア キャッシュの種類です。単一プロセスのアドレス空間内で保持され、そのプロセスから直接アクセスされるインメモリ ストアです。
分散キャッシュは複数のサーバーにまたがるため、1 台のマシンを超えてキャッシュとトランザクション容量を拡張できます。多くの共有キャッシュ サービスはサーバーのクラスターを使用し、キャッシュされたデータをクラスター全体に分散します。キャッシュのスケーリングは、サーバーを追加するだけで済む場合があります。また、一部の分散設計ではキャッシュを階層化し、あるレイヤーでミスが発生すると上流のプロバイダーから取得して、その結果を次の要求のためにローカルに保存します。
キャッシュを使うと、頻繁にアクセスされるデータが使用場所の近くに保持されるため、応答時間を改善し、システムがより多くの同時要求を処理できるようになります。また、データベースの接続数に制限がある場合など、元のデータ ストアでの競合を減らすこともできます。
分散アプリケーションでは、キャッシュは通常、クライアント側 (ブラウザーなど) とサーバー側 (アプリケーションまたは共有キャッシュ サービス内) の複数の場所で発生します。
小さく始めて、最も明確な成果が得られるデータに重点を置きます:
キャッシュには通常、プライマリ ストアのデータのコピーが保持されるため、鮮度に注意が必要です:
キャッシュは、単一サービスから分散アプリ、エッジ配信まで多くのアーキテクチャに適合するため、最新のシステムにおけるコアの構成要素です。マネージド インメモリ キャッシュ クラウド プロバイダーについては、Azure で詳細を確認できます。