JSON について

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

  • 高速な検索とフィルタリングが可能
  • ドキュメント全体を上書きせずに JSON データをインプレース更新できる
  • 複雑なデータ構造を効率的にクエリ、変更、管理できる

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

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

対象

バージョン 8.0 以降の Memorystore for Valkey インスタンスを作成すると、 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 ×

JSON 指標

JSON ドキュメントの使用状況をモニタリングするために、Memorystore for Valkey では次の Cloud Monitoring 指標を使用できます。

  • documents_count
  • used_memory

これらの指標の詳細については、Bloom フィルタと JSON 指標をご覧ください。

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 Valkey は次のサブコマンドをサポートしています:
  • 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 Valkey と JSON の連携

このセクションでは、Memorystore for Valkey と JSON データ型の連携について説明します。

複数の条件式

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

  1. かっこ内のオペレーション
  2. 論理 AND 式(&&
  3. 論理 OR||)式

ネスト深度の上限

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

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

JSON 数値

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

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

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

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

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

直接配列

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

配列インデックス

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

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

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

JSON パスの構文

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