キャッシングについて知っておくべきことすべて



良い一日。Animesh Gaitondeによる

記事「キャッシングについて知っておくべきことすべて-システム設計」の翻訳を紹介します

前書き


インターネット接続の悪いWebページを閲覧すると、高品質の画像の前にテキストが読み込まれることに気づきましたか。ただし、同じページに再度アクセスすると、読み込みがはるかに速くなります。新しいサイトにアクセスすると、FacebookやAmazonなどの頻繁にアクセスするサイトをダウンロードするよりも、ダウンロードに時間がかかります。なぜこれが起こっているのか知っていますか?それはすべてキャッシングに関するものです。



これは、接続が遅い場合のInstagramページです。ご覧のとおり、画像がまだ読み込まれていないときにテキストが表示されます。

アプリケーションを使用してユーザーを維持し、引き付けるために最高のエクスペリエンスを提供することは非常に重要です。競争の精神が支配する現代の世界では、貧弱なユーザーエクスペリエンスのためにビジネスは大きな打撃を受けています。 Webサイトでお気に入りのシリーズまたはストリーミングビデオを視聴しているが、追加の読み込み(バッファリング)のためにビデオが常に停止していると想像してください。そのような「態度」にどれくらい耐え、そのようなサイトに戻るのでしょうか。

キャッシングは「リンクのローカライズ」の原則に基づいて機能します。キャッシュは、情報の取得とデータの回復を高速化するローカルデータウェアハウスです。キャッシュの主な目的は、データの読み取りの遅延を減らし、アプリケーションのスループットを向上させることです。実際の例をいくつか見てみましょう。

キャッシュの使用


毎日夕食を作るとしましょう。料理には、さまざまな食材、野菜、スパイスなどが必要です。しかし、あなたはこれのために毎日店に行きますか?これは非常に面倒で時間がかかる可能性があります。もちろん、あなたがキッチンや冷蔵庫の中のクローゼットを最初に見るもの。これは、スーパーマーケットへの不必要な旅行を回避するのに役立ちます。



あなたの冷蔵庫は野菜の一種のキャッシュです。このキャッシュの明らかな利点は、ディナーの準備時間を大幅に節約できることです。

キャッシュはどのように機能しますか?


サーバーアプリケーションは通常、データベースにデータを格納します。クライアントがデータを要求すると、アプリケーションはデータベースに要求を送信し、そこからデータを受信して​​クライアントに送信します。データベースサーバーはオフラインであり、アプリケーションサーバーが配置されているコンピューターとは別のコンピューターに配置できます。



ファイルシステムからデータを取得するには、リクエストを送信してI / Oを実行する必要があるため、データベースからのデータの読み取りは非常に遅いプロセスです。データがキャッシュに保存されている場合、読み取り操作は非常に高速になります。クライアントが同じデータを繰り返し要求する場合、データベースではなくキャッシュからデータを返すのが理にかなっています。

たとえば、ツイートがバイラルである場合、すべてのクライアントが同じツイートのデータをリクエストします。Twitterには数百万のユーザーがいるため、キャッシュを使用すると数百万のデータベースクエリを回避できます。

したがって、キャッシュはデータベースの負荷を軽減します。要求されたデータがキャッシュにある場合、データベース要求はリダイレクト(インターセプト)されます。キーと値のペアを格納するハッシュテーブルとの類似点を描くことができます。

次の図は、キャッシュからデータを読み取るプロセスを示しています。



主要なキャッシュの概念


存続時間(TTL)


これらは、キャッシュに保存できるデータ量の制限です。アプリケーションサーバーで不要になったキャッシュ内のエントリを削除する必要があります。

Netflixの場合、サーバーは最も視聴された、または人気のある番組をキャッシュします。誰も見ていない番組をキャッシュする必要はありません。

たとえば、Paper Houseシリーズのキャッシュは、インディアナジョーンズの映画よりも合理的です。

ポリシーを削除


ある時点で、キャッシュがいっぱいになります。したがって、古い(関連のない)データを削除し、新しい(関連のある)情報で置き換える必要が生じます。

キャッシュをクリアするためのポリシーには、「古い(最近使用されていない)」(最近使用されていない、LRU)、「まれに要求された(使用されていない)」(最も頻繁に使用されていない、LFU)、「最後に使用された(最近使用された)」などがあります。最近使用されたMRU)。これらのポリシーは、特定の原則に従ってキャッシュからデータを削除します。

古い


長期間リクエストされていないデータはキャッシュから削除されます。キャッシュがいっぱいになると、古いデータが削除され、新しいデータが追加されます。

Facebookが有名人の写真をキャッシュするとします。加入者の要求の分析は、新しい写真の関連性を示しています。キャッシュがいっぱいになると、最も古い写真がキャッシュから削除されます。

めったに要求されない


LFUは、データ要求の頻度または数を追跡します。キャッシュサイズがしきい値に近づくと、ほとんど要求されていないデータが削除されます。

テキストを入力すると、電話は単語を終了するためのさまざまなオプションを提供し始めます。そのいずれかをフルセット(完成)の代わりに選択できます。スマートフォンソフトウェアは、最も頻繁に入力された単語をキャッシュします。



まれに入力された単語は、その後このキャッシュから削除されます。上記の例で、「feature」、「features」、「feather」などの単語を使用すると、キャッシュから削除されるため、しばらくすると電話機は「feat」の提供を停止します。

最終


このポリシーでは、最新のデータが削除される可能性があり、キャッシュに保存されている古いデータが優先されます。この戦略は、ユーザーが最新のデータを取得することにあまり関心がないようなデータ取得テンプレートである場合に使用されます。例を考えてみましょう。



Tinderなどの出会い系アプリケーションは通常、ユーザーのすべての潜在的なパートナー(潜在的な一致または設定)をキャッシュします。ユーザーが潜在的なパートナーの特定のプロファイルを左または右に移動してフィードをめくった場合、アプリケーションはこのプロファイルをユーザーに推奨しないはずです。これが発生すると、ユーザーエクスペリエンスが低下します。

この場合、最新のデータを削除する必要があります。アプリケーションは、キャッシュから表示されたプロファイルを削除する必要があります。

キャッシュの種類


キャッシュ記録


名前が示すように、データは最初にキャッシュに書き込まれ、次にデータベースに書き込まれます。これにより、キャッシュとデータベースのデータの整合性が確保されます。キャッシュからのデータの各読み取りは、最新のレコードに対応しています。



このアプローチの欠点は、記録時間の増加です。データの書き込み操作が頻繁に行われる負荷の高いシステムには適していません。ただし、データベースに格納されているデータを頻繁に再読み取りするアプリケーションには最適です。遅い書き込みは、高速な読み取りと一貫性によって相殺されます。

キャッシュエントリ


最初のアプローチの代替方法は、データをキャッシュに書き込み、その後のデータベースの更新のためにデータ変更に関するメモを追加することです。



定期的な非同期操作を使用して、キャッシュ内の更新されたデータを読み取り、データベース内の対応するデータを変更できます。このアプローチでは、読み取り/書き込み操作は増加しません。ここでの唯一の欠点は、キャッシュとデータベース間の同期の遅延です。これは、真実のソースとしてデータベースに依存するアプリケーションが古いデータを読み取るという事実につながる可能性があります。

たとえば、YouTubeはこのアプローチを使用して、特定のビデオの再生回数に関する情報を保存します。バイラルビデオのビューごとにデータベースを更新すると、非常にコストがかかります。最善の解決策は、データをキャッシュに書き込んでからデータベースと同期することです。

キャッシュバイパスレコード


いくつかのサーバーアプリケーションは、最新のデータを再読み取りしないことがよくあります。この場合、キャッシュバイパスエントリが使用されます。



このアプローチでは、データベースはキャッシュなしで更新されます。これにより、要求されていないデータをキャッシュにロードすることが回避されます。ただし、アプリケーションがキャッシュにない最新のデータをまだ要求している場合は、データベースからそのようなデータが読み込まれ、結果としてすべての結果が生じます。

分散キャッシュの使用例


開いているキャッシュプロジェクトのリスト:

  • Redis
  • Memcached
  • Voltdb
  • Aerospike dbs
  • アパッチに火をつける

清聴ありがとうございました。

All Articles