

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

# キャッシュ読み取り動作
<a name="cache-read"></a>

シムは、DynamoDB に対して行われた結果整合性のある読み込み呼び出しのみをキャッシュする必要があります。これには `get_item`、`batch_get_item`、`query`、および `scan` があります。これらの呼び出しは本質的にキャッシュされたバージョンのデータを表示したくないため、強力な整合性のある読み取り呼び出しやトランザクション読み取り呼び出しをキャッシュしないでください。

キャッシュエントリは、後続の同等のリクエストを識別するために、リクエストの署名を理解する必要があります。各呼び出しの署名は、結果に影響するリクエストのすべてのパラメータで構成されます。`get_item` 呼び出しの場合、署名には `TableName`、`Key`、`ProjectionExpression`、および `ExpressionAttributeNames`パラメータが含まれます。クエリ呼び出しには、`TableName`、、`IndexName`、`KeyConditions`、`ScanIndexForward`、および `FilterExpression``Limit`パラメータが含まれます。同じ関数への 2 つの呼び出しに同じ署名がある場合、キャッシュヒットの可能性があります。

`get_item` 呼び出しのサンプルロジックフローを次に示します。
+ を確認します`ConsistentRead=true`。その場合は、データベースを直接呼び出して結果を返します。強力な整合性のある呼び出しでは、キャッシュを使用しないでください。
+ 呼び出しの署名を計算します。`TableName`、、`Key`、および `ExpressionAttributeNames`パラメータをハッシュして`ProjectionExpression`、単一の文字列署名値を取得します。
+ この署名キーを持つキャッシュエントリが存在するかどうかを確認します。その場合はキャッシュヒットであるため、返します。
+ そうでない場合は、呼び出しをデータベースに渡し、結果を取得し、この署名のキャッシュエントリを入力し、結果を返します。項目を保存するときは、有効期限 (TTL) を指定します。

たとえば、次のコードがあるとします。

```
cache_client.get_item(
  TableName='test',
  Key={ 'PK': { 'S': '123' } },
  ProjectionExpression='#attr1, #attr2',
  ExpressionAttributeNames={
    '#attr1': 'agent',
    '#attr2': 'count'
  },
  ConsistentRead=False
)
```

内では`cache_client`、コードは呼び出しのハッシュ署名を計算します。署名は、、`TableName`、`Key`、`ProjectionExpression`および `ExpressionAttributeNames`パラメータの連結をハッシュすることによって算出されます。ハッシュシステムは、決定論的であり、単一の文字列値を生成する限り使用できます。この場合、ハッシュを にするとします`0xad4c812a`。このハッシュは、このパラメータのセットを識別します。

の名前`#attr1`が変更された場合を除き、同じ の別の呼び出しが行われた場合はどうなりますか`#attribute1`？ その呼び出しは同じ署名を持つと見なされるべきですか？ セマンティック的に同一であるため、理想的にはははい。ただし、すべての呼び出しでセマンティック同等性を計算するオーバーヘッドは実用的ではありません。パラメータ値を暗黙的にハッシュする方がはるかに高速で、完全一致が必要です。ルール: 呼び出しは、*実際に*は同じ呼び出しである場合はキャッシュヒットの対象になりますが、*基本的に*は同じ呼び出しである場合は対象外です。

内では`cache_client`、コードは に保存されている項目キャッシュ内のエントリを ElastiCache で検索します`0xad4c812a`。エントリが存在する場合は、キャッシュヒットです。そうでない場合、値はデータベースから取得され、後のキャッシュヒットのために ElastiCache に保存されます。

3 つの異なるテーブル、キー、射影パラメータのセットを持つ 3 つの`get_item`呼び出しのキャッシュは次のようになります。


| 擬似コード | 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': … }` | 

`query` や などの他の呼び出しも同じように`scan`動作しますが、異なるパラメータが署名を構成します。

この設計では、HTTP キャッシュプロキシの仕組みを思い出すかもしれません。同じリクエストが再度表示される場合は、前のリクエストからのレスポンスを返すことができます。HTTP での*同じリクエスト*の定義は、主にクエリ文字列に基づいています。DynamoDB では、関数に渡される呼び出しタイプとパラメータのセットが結果に影響します。

もう 1 つのステップがあります。項目キャッシュでは、各項目のプライマリキーと、その項目のキャッシュにアクティブに使用されるハッシュのリストとのマッピングを維持することが重要です。これは、次のセクションで説明するように、書き込みオペレーション中に有効になります。したがって、前のキーと値に加えて、次のような追加のキャッシュエントリがあります。


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