今日はなにの日。

気になったこと勉強になったことのメモ。

今日は、Amazon ElastiCacheのキャッシュ戦略の違いの日。

目次

とある日

AWS の勉強用の記録。

よく問題集とかで出る項目だけを調べてまとめるだけ。

キャッシュ戦略 - Amazon ElastiCache for Redis

キャッシュするデータとデータへのアクセスパターンに基づいて、キャッシュを入力し維持するために実装する戦略とは何か。たとえば、ゲームサイトやトレンドのニュースのランキングトップ 10 で同じ同じ戦略は使用したくないでしょう。このセクションの後半では、一般的なキャッシュのメンテナンス戦略、利点および欠点について説明します。

遅延読み込み

必要なときにのみキャッシュにデータを読み込むキャッシュ戦略です。

一般的なキャッシュの挙動をしていると思う。

流れ。

アプリケーションとアプリケーションがアクセスするデータストア (データベース) 間にあります。アプリケーションがデータをリクエストする場合は、常に ElastiCache キャッシュに最初にリクエストを行います。データがキャッシュにあり最新である場合、ElastiCache はアプリケーションにデータを返します。データがキャッシュにない場合、または期限が切れている場合は、アプリケーションはデータストアからのデータをリクエストします。その後、データストアはアプリケーションにデータを返します。次に、アプリケーションは、ストアから受信したデータをキャッシュに書き込みます。このようにして、次回リクエストされたときに、より迅速に取得できます。

キャッシュヒット

データがキャッシュにあり、期限切れでない場合に発生します。

  1. アプリケーションは、キャッシュに対してデータをリクエストします。
  2. キャッシュはアプリケーションにデータを返します。

キャッシュミス

データがキャッシュにないか、期限切れの場合に発生します。

  1. アプリケーションは、キャッシュに対してデータをリクエストします。
  2. キャッシュにはリクエストされたデータがないため、null を返します。
  3. アプリケーションはデータベースに対してデータをリクエストし、取得します。
  4. アプリケーションは、新しいデータでキャッシュを更新します。

遅延読み込みの利点と欠点

利点

  • リクエストされたデータのみをキャッシュします。

    ほとんどのデータがリクエストされないため、遅延読み込みではデータでキャッシュがいっぱいになることを回避できます。

  • ノード障害は、アプリケーションにとって致命的ではありません。

    ノードで障害が発生して新しい空のノードに置き換えられた場合、アプリケーションはレイテンシーが長くなっても機能し続けます。新規ノードへのリクエストが行われると、それぞれのキャッシュミスにより、データベースのクエリが行われます。同時に、後続のリクエストがキャッシュからデータを取得できるように、データコピーがキャッシュに追加されます。

欠点

  • キャッシュミスのペナルティがあります。1 回のキャッシュのミスで 3 回のトリップ:

    1. キャッシュに対する最初のデータリクエス
    2. データベースへのデータクエリ
    3. キャッシュにデータを書き込む

    これらのミスにより、アプリケーションによるデータの取得に相当な遅延が発生する可能性があります。

  • 古いデータ。

    キャッシュミスがある場合にのみデータがキャッシュに書き込まれる場合は、キャッシュ内のデータが古くなる可能性があります。この結果は、データベースのデータが変更されたときに、キャッシュへの更新がないために発生します。この問題に対処するには、書き込みスルー および TTL の追加 戦略を使用できます。

書き込みスルー

書き込みスルー戦略では、データがデータベースに書き込まれると常にデータを追加するか、キャッシュのデータを更新します。

書き込みスルーの利点と欠点

利点

  • キャッシュのデータが古くなりません。

    キャッシュにデータベースにデータが書き込まれるたびにキャッシュのデータが更新されるため、キャッシュのデータが常に最新の状態になります。

  • 書き込みペナルティ対読み取りペナルティ。

    1 回の書き込みで 2 回のトリップ:

    1. キャッシュへの書き込み
    2. データベースへの書き込み

    レイテンシーをプロセスに追加します。つまり、エンドユーザーは一般的に、データの取得時よりもデータの更新時のレイテンシーに対して寛容です。更新は作業量が大きく時間がかかるのが常です。

欠点

  • 欠落データ。

    ノード障害またはスケールアウトにより、新規ノードをスピンアップすると、データが欠落しています。このデータは、データベースで追加または更新されるまで失われ続けます。これを最小限に抑えるには、[遅延読み込み] を書き込みスルーで指定します。

  • キャッシュの変動。

    ほとんどのデータは読み込まれないため、これはリソース浪費です。[有効期限 (TTL) の値を追加する] を使用すると、無駄なスペースを最小限に抑えることができます。

まとめ

  • 遅延読み込み:一般的なキャッシュの挙動
  • 書き込みスルー:最新のデータをキャッシュする要求の場合に使用する

ユースケース

  • 遅延読み込み:トレンドニュース
  • 書き込みスルー:ゲームサイトのトップ10リーダーボード

トレンドニュースはよくリクエストされる対象かつそこまで最新のデータを求めるものではないと思うので遅延読み込みで対応しても良いと思います。

逆に、一分でランキングが変わるようなゲームのランキングはリアルタイムな読み込みを求めるものですし、値の変更が頻繁に発生するので書き込みスルーで対応するのがいいと思います。

どっちの戦略なのか見極め

  • コストを抑えるのは→遅延読み込み
  • 最新のデータなのは→書き込みスルー
  • ノード障害に対応させる→遅延読み込み
  • 遅延を最小限に抑える→書き込みはスルー

名前がややこしいが遅延読み込みが自分の理解している一般的なキャッシュの挙動だと思った。