

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# キャッシュ書き込み動作
<a name="cache-write"></a>

このガイドでは、初回の読み取り時に項目がキャッシュされる、リードスルーキャッシュについて説明します。書き込みスルーキャッシュは、書き込みオペレーション中にエントリをキャッシュにプッシュしますが、このガイドでは次の 2 つの理由でこれを行うことを提案していません。
+ 項目が書き込まれると、すぐに読み取られる兆候はなく、使用されていないキャッシュエントリを書き込むのは無駄です。
+ キャッシュされた項目は、異なる署名キーで複数回キャッシュされる場合があります。たとえば、射影式が異なると、キャッシュエントリも異なります。したがって、リクエストが到着する前にエントリを保存する署名キーが明確ではありません。項目全体を 1 回だけキャッシュするのがより適切であると考えると、リクエストで`ProjectionExpression`パラメータが指定されている場合は、キャッシュラッパー内で射影をライブに適用できます。残念ながら、これは単純な`ProjectionExpression`文法を実装する必要があるため、非常に複雑になります。キャッシュラッパーを非常にシンプルにして、以前に発生したリクエストのみをキャッシュし、新しいレスポンスをできるだけ考案しないようにする方が簡単です。データベースは、 が`ProjectionExpression`解釈される唯一の場所とします。これにより、簡単な書き込みスルーキャッシュモデルが不要になります。

ただし、書き込みオペレーションはインテリジェントであり、以前に保存された書き込み項目に関連する項目キャッシュエントリをプロアクティブに無効にできます。これにより、TTL の有効期限を待つことなく、項目キャッシュを最新の状態に保つことができます。キャッシュエントリは、次の読み取り時に再入力されます。

**注記**  
この DynamoDB 統合の主な利点は、同様に設計されたリレーショナルデータベースキャッシュ統合と比較して、DynamoDB への書き込みごとに、常に書き込まれる項目のプライマリキーを指定することです。読み取りキャッシュは、書き込み呼び出しを監視し、完全で即時の項目キャッシュ無効化を実行できます。リレーショナルデータベースを使用する場合、`UPDATE`ステートメントは影響を受ける可能性のある項目を識別せず、TTL 以外のキャッシュされた行エントリを無効にするパッシブな方法もありません。

書き込み呼び出しは、次のロジックフローを実装します。
+ データベースに対して書き込みオペレーションを実行します。
+ オペレーションが成功した場合は、書き込みのテーブルとプライマリキーを抽出します。
+ プライマリキーに関連する項目キャッシュエントリを無効にします。

この最後のステップを可能にするには、いくつかのハウスキーピングが必要です。項目キャッシュエントリは署名のハッシュに保存されるため、無効にするキーを知る必要があります。これを行うには、項目プライマリキーとそのプライマリキーに関連付けられている保存済み署名のリスト間のマッピングをキャッシュ内に維持します。これは、無効化する必要がある項目のリストです。

前の表を次に示します。


| 擬似コード | ElastiCache キーの計算 | ElastiCache 値 | 
| --- | --- | --- | 
| `get_item(t1, k1, p1)` | `hash('get', t1, k1, p1) = 0xad4c812a` | `{ 'Item': … }` | 
| `get_item(t1, k1, p2)` | `hash('get', t1, k2, p2) = 0x045deaab` | `{ 'Item': … }` | 
| `get_item(t1, k2, p1)` | `hash('get', t1, k2, p1) = 0x9cda78af` | `{ 'Item': … }` | 

前のハウスキーピングテーブル：


| Operation | ElastiCache キーの計算 | ElastiCache 値 | 
| --- | --- | --- | 
| テーブル `t1`、 キーのエントリのリストを追跡する `k1` | `hash('list', t1, k1)` | ( `0xad4c812a, 0x045deaab` ) | 
| テーブル `t1`、 キーのエントリのリストを追跡する `k2` | `hash('list', t1, k2) ` | ( `0x9cda78af` ) | 

テーブルに書き込みオペレーションがあり、項目`t1`にプライマリキー があるとします`k1`。次のステップでは、その項目に関連するエントリを無効にします。

完全なロジックは次のとおりです。
+ データベースに対して書き込みオペレーションを実行します。
+ オペレーションが成功した場合は、書き込み用のテーブルとプライマリキーを抽出します。
+ キャッシュから、そのプライマリキーに関連付けられている保存済みハッシュ署名のリストをプルします。
+ これらの項目キャッシュエントリを無効にします。
+ そのプライマリキーのハウスキーピングリストを削除します。

項目書き込みオペレーションの一部としてクエリキャッシュエントリをプロアクティブに無効にする方法があることは嬉しいことです。ただし、どのキャッシュされたクエリ結果が更新された項目の影響を受けるかを、効率的かつ確実に判断することはほぼ不可能であるため、この設計を考案することは非常に困難です。このため、クエリキャッシュエントリには、TTL 設定で期限切れにするよりも適切なオプションはありません。