JSON について

JavaScript Object Notation(JSON)を使用すると、Memorystore for Redis Cluster で構造化データを効率的に保存して操作できます。JSON を使用すると、次のメリットがあります。

  • 高速な検索とフィルタリング機能がある
  • ドキュメント全体を上書きすることなく、JSON データのインプレース更新を実行する
  • 複雑なデータ構造のクエリ、変更、管理を効率的に行う

アプリケーションで動的で柔軟なデータ ストレージが必要な場合は、JSON が理想的な選択肢となります。また、JSON を使用すると、スキーマを使用せずに Memorystore for Redis Cluster のクラスタ内の複雑なデータセットをエンコードできます。クラスタ内のデータの保存、アクセス、更新が可能で、データのシリアル化と逆シリアル化を行うカスタムコードを管理する必要はありません。

JSON ドキュメントは、データを保存して転送するための人が読めるテキスト形式です。この形式は、Key-Value ペアと構造化データ型で構成されます。JSON 形式を使用すると、オブジェクト全体を操作しなくても、JSON ドキュメントの一部を取得して更新できます。これにより、パフォーマンスを向上させ、費用を削減できます。また、JSON 形式は、RFC 7159ECMA-404 JSON データ交換標準、JSON テキストの UTF-8 Unicode に準拠しています。

対象

Memorystore for Redis Cluster バージョン 8.0 以降でクラスタを作成すると、JSON データ型と関連コマンドのバージョン 1.0 が自動的に使用可能になります。このデータ型は、JSON モジュールのバージョン 2 と API 互換性があります。また、RFC 7159 以降、JSON ドキュメントのルート要素は任意の JSON データ型にできます。

JSON プロパティ

JSON には次のプロパティがあります。

  • ドキュメントの最大サイズ: 悪意のある挿入や無制限の挿入によるメモリ不足の問題を防ぐため、個々の JSON キーのサイズに上限を設定できます。

    デフォルトでは、このプロパティの値は 0 に設定されています。これは、JSON ドキュメントのサイズに上限がないことを意味します。この上限を設定するには、CONFIG SET json.max-document-size VALUE コマンドを使用します。ここで、VALUE はドキュメントの最大サイズです。たとえば、4123456 を指定した場合、ドキュメントの最大サイズは 4,123,456 バイト(4 MB)です。

    指定されたキーに保存されている JSON 値で使用されているメモリの量を確認するには、JSON.DEBUG MEMORY KEY コマンドまたは MEMORY USAGE KEY コマンドを使用します。これらのコマンドでは、KEY は JSON 値が格納されるキーの名前です。

  • 最大深度: JSON オブジェクトと配列の最大ネストレベル。詳細については、最大ネストの深さの上限をご覧ください。

JSON ドキュメントのサイズ

JSON ドキュメントは、高速なアクセスと変更に最適化された形式で内部的に保存されるため、このタイプのドキュメントは大量のメモリを消費する可能性があります。JSON ドキュメントが消費するメモリの量を確認するには、JSON.DEBUG MEMORY KEY コマンドを使用します。ここで、KEY はドキュメントを含むキーの名前です。

JSON カテゴリ

JSON コマンドとデータへのアクセスを管理するには、@json カテゴリを使用します。このカテゴリに加えて、@read@write@fast@slow@admin のカテゴリでも JSON コマンドが使用されます。

次の表は、JSON コマンドを @read@write@fast@slow@admin@json のカテゴリにマッピングできるかどうかを示しています。

JSON コマンド @json @read @write @fast @slow @admin
JSON.ARRAPPEND Y × Y Y N ×
JSON.ARRINDEX Y Y × N ×
JSON.ARRINSERT × Y Y N ×
JSON.ARRLEN Y Y × N ×
JSON.ARRPOP × Y Y N ×
JSON.ARRTRIM × Y Y N ×
JSON.CLEAR × Y Y N ×
JSON.DEBUG Y Y N × Y
JSON.DEL Y × Y Y N ×
JSON.FORGET × Y Y N ×
JSON.GET Y Y × N ×
JSON.MGET Y Y × N ×
JSON.MSET × × ×
JSON.NUMINCRBY × Y Y N ×
JSON.NUMMULTBY × Y Y N ×
JSON.OBJKEYS Y Y × N ×
JSON.OBJLEN Y Y × N ×
JSON.RESP Y Y × N ×
JSON.SET × × ×
JSON.STRAPPEND × Y Y N ×
JSON.STRLEN Y Y × N ×
JSON.TOGGLE × Y Y N ×
JSON.TYPE Y Y × N N

JSON コマンド

このセクションでは、JSON ドキュメントに対してオペレーションを実行するために使用できる JSON コマンドの一覧と説明を示します。

コマンド 説明
JSON.ARRAPPEND パスにある配列に 1 つ以上の JSON 値を追加します。
JSON.ARRINDEX 配列内のスカラー JSON 値の最初の出現を検索します。
JSON.ARRINSERT 指定したインデックスの前のパスにある配列に 1 つ以上の JSON 値を挿入します。
JSON.ARRLEN パスにある JSON 配列の長さを取得します。
JSON.ARRPOP 配列内のインデックスから要素を削除して返します。
JSON.ARRTRIM パスで配列をトリムして、指定した要素の包括的な範囲のみが含まれるようにします。
JSON.CLEAR 指定したパスにある配列または JSON オブジェクトをクリアします。
JSON.DEBUG JSON ドキュメントに関する情報を取得します。Memorystore for Redis Cluster は、次のサブコマンドをサポートしています。
  • MEMORY: 値のメモリ使用量をバイト単位でレポートします。
  • DEPTH: JSON ドキュメントの最大パスの深さをレポートします。
  • FIELDS: JSON 要素内のフィールドの数をレポートします。この要素は、指定したキーに保存されます。
  • HELP: JSON.DEBUG コマンドに関する役立つ情報を返します。
JSON.DEL
JSON.FORGET
指定したパスにある JSON 値を削除します。
JSON.GET JSON シリアル化形式で指定したパスの値を返します。
JSON.MGET 複数のドキュメント キーから指定したパスにある値を返します。
JSON.MSET パスにある複数の JSON 値を複数のキーに設定します。
JSON.NUMINCRBY パスに保存されている数値を、指定した数値で増分します。
JSON.NUMMULTBY パスに保存されている数値を、指定した数値で乗算します。
JSON.OBJKEYS 指定したパスにある JSON オブジェクトからキー名を取得します。
JSON.OBJLEN 指定したパスにある JSON オブジェクト内のキーの数を取得します。
JSON.RESP Redis シリアル化プロトコル(RESP)形式でキーの JSON 値を返します。
JSON.SET 指定したパスに JSON 値を設定します。
JSON.STRAPPEND 指定したパスにある JSON 文字列に文字列を追加します。
JSON.STRLEN 指定したパスにある JSON 文字列値の長さを取得します。
JSON.TOGGLE ブール値を truefalse の間で切り替えます。この値は、指定したパスに保存されます。
JSON.TYPE 指定したパスにある JSON 値の型を取得します。

Memorystore for Redis Cluster と JSON の連携方法

このセクションでは、Memorystore for Redis Cluster が JSON データ型とどのように連携するかについて説明します。

複数の条件式

フィルタリングの条件式が複数ある場合、Memorystore for Redis Cluster は次の順序で評価します。

  1. かっこ内の演算
  2. 論理 AND 式(&&
  3. 論理 OR||)式

ネストの深さの上限

JSON オブジェクトまたは配列に別の JSON オブジェクトまたは配列である要素がある場合、内側のオブジェクトまたは配列は外側のオブジェクトまたは配列内にネストされます。ネストの深さの上限は 128 です。したがって、$.a.b.c.d... などの値は 128 レベルまでしか到達できません。

ネストの深さが 128 を超える JSON ドキュメントを作成しようとすると、Memorystore for Redis Cluster はドキュメントを拒否し、エラーが返されます。ただし、CONFIG SET json.max-path-limit VALUE コマンドを使用すると、この上限を調整できます。ここで、VALUE は必要な深さの上限です。

JSON 数値

JSON では、浮動小数点数と整数は同じデータ型であるため、どちらも数値と呼ばれます。Memorystore for Redis Cluster が JSON 数値を受信すると、その数値を次のいずれかの内部バイナリ表現に変換します。

  • 64 ビット IEEE 倍精度浮動小数点数
  • 64 ビット符号付き整数

JSON では、元の文字列とその書式設定がすべて保持されません。Memorystore for Redis Cluster が JSON レスポンスの一部として数値を出力する場合、Memorystore for Redis Cluster は、内部のバイナリ表現から一般的な形式ルールを使用する印刷可能な文字列に数値を変換します。

JSON 数値で JSON.NUMINCRBY コマンドと JSON.NUMMULTBY コマンドを使用する場合、次の条件が適用されます。

  • 両方の数値が整数で、結果が int64 の範囲外の場合、結果は自動的に 64 ビット IEEE 倍精度浮動小数点数になります。
  • 少なくとも 1 つの数値が浮動小数点数の場合、結果は 64 ビット IEEE 倍精度浮動小数点数になります。
  • 結果が 64 ビット IEEE 倍精度浮動小数点数の範囲を超えると、OVERFLOW エラー メッセージが表示されます。

直接配列

Memorystore for Redis Cluster は、配列オブジェクトを直接フィルタします。たとえば、
&lbrack;0,1,2,3&rbrack; などのデータと $[?(@<3)] などのパスクエリがある場合、Memorystore for Redis Cluster は &lbrack;0,1,2&rbrack; を返します。{"my_valkey_key":[0,1,2,3]} などのデータと
$.my_valkey_key[?(@<3)] などのパスクエリの場合、Memorystore for Redis Cluster は &lbrack;0,1,2&rbrack; も返します。

配列のインデックス

Memorystore for Redis Cluster では、配列に正と負のインデックスを使用できます。これらのタイプのインデックスには、次の条件が適用されます。

  • 正のインデックス: 配列の先頭から始まる数値。たとえば、配列の正のインデックスが 3 の場合、0 は最初の要素をクエリし、1 は 2 番目の要素をクエリし、2 は 3 番目の要素をクエリします。
  • 負のインデックス: 配列の末尾から始まる数値。配列のインデックスが -3 の場合、-1 は 3 番目の要素を、-2 は 2 番目の要素を、-3 は最初の要素をクエリします。

Memorystore for Redis Cluster は、インデックスを切り上げたり切り下げたりしません。長さが 3 の配列があり、3 より大きい正のインデックスまたは -3 より小さい負のインデックスを呼び出すと、Memorystore for Redis Cluster は結果を返しません。

JSON パスの構文

JSON パスに無効な構文を使用することはできません。この条件は、構文が無効な JSON パスのサブセットに有効なパスが含まれている場合でも適用されます。