JavaScript 对象表示法 (JSON) 提供了一种高效的方式,让您可以在 Memorystore for Valkey 中存储和操控结构化数据。使用 JSON 可为您带来以下优势:
- 具备快速搜索和过滤功能
- 对 JSON 数据执行就地更新,而无需覆盖整个文档
- 高效查询、修改和管理复杂的数据结构
如果您的应用需要动态且灵活的数据存储,那么 JSON 是您的理想之选。此外,通过使用 JSON,您可以在 Memorystore for Valkey 实例中对复杂的数据集进行编码,而无需使用架构。您可以在实例中存储、访问和更新数据,并且无需管理自定义代码来序列化和反序列化数据。
JSON 文档是一种人类可读的文本格式,用于存储和传输数据。此格式由键值对和结构化数据类型组成。借助 JSON 格式,您可以检索和更新 JSON 文档的部分内容,而无需操控整个对象。这有助于提高性能并降低费用。此外,JSON 格式符合 RFC 7159、ECMA-404 JSON 数据交换标准以及 JSON 文本中的 UTF-8 Unicode 。
可用性
如果您创建的是 Memorystore for Valkey 实例(版本 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
类别。除了此类别之外,以下类别也使用 JSON 命令:@read、@write、@fast、@slow 和 @admin。
下表说明了您是否可以将 JSON 命令映射到 @read、@write、@fast、@slow、@admin 和 @json 类别。
| JSON 命令 | @json |
@read |
@write |
@fast |
@slow |
@admin |
|---|---|---|---|---|---|---|
JSON.ARRAPPEND |
Y | N | 是 | 是 | 否 | 否 |
JSON.ARRINDEX |
是 | 是 | N | 是 | 否 | 否 |
JSON.ARRINSERT |
是 | N | 是 | 是 | 否 | 否 |
JSON.ARRLEN |
是 | 是 | N | 是 | 否 | 否 |
JSON.ARRPOP |
是 | N | 是 | 是 | 否 | 否 |
JSON.ARRTRIM |
是 | N | 是 | 是 | 否 | 否 |
JSON.CLEAR |
是 | N | 是 | 是 | 否 | 否 |
JSON.DEBUG |
是 | 是 | 否 | 否 | 是 | 是 |
JSON.DEL |
是 | N | 是 | 是 | 否 | 否 |
JSON.FORGET |
是 | N | 是 | 是 | 否 | 否 |
JSON.GET |
是 | 是 | N | 是 | 否 | 否 |
JSON.MGET |
是 | 是 | N | 是 | 否 | 否 |
JSON.MSET |
是 | N | 是 | N | 是 | N |
JSON.NUMINCRBY |
是 | N | 是 | 是 | 否 | 否 |
JSON.NUMMULTBY |
是 | N | 是 | 是 | 否 | 否 |
JSON.OBJKEYS |
是 | 是 | N | 是 | 否 | 否 |
JSON.OBJLEN |
是 | 是 | N | 是 | 否 | 否 |
JSON.RESP |
是 | 是 | N | 是 | 否 | 否 |
JSON.SET |
是 | N | 是 | N | 是 | N |
JSON.STRAPPEND |
是 | N | 是 | 是 | 否 | 否 |
JSON.STRLEN |
是 | 是 | N | 是 | 否 | 否 |
JSON.TOGGLE |
是 | N | 是 | 是 | 否 | 否 |
JSON.TYPE |
是 | 是 | N | 是 | 否 | N |
JSON 命令
本部分列出并介绍了可用于对 JSON 文档执行操作的 JSON 命令。
| 命令 | 说明 |
|---|---|
JSON.ARRAPPEND |
将一个或多个 JSON 值附加到路径中的数组。 |
JSON.ARRINDEX |
在数组中搜索第一个标量 JSON 值。 |
JSON.ARRINSERT |
在您指定的 索引之前的路径中,将一个或多个 JSON 值插入到数组中。 |
JSON.ARRLEN |
检索路径中 JSON 数组的长度。 |
JSON.ARRPOP |
从数组中的索引移除并返回元素。 |
JSON.ARRTRIM |
修剪路径中的数组,使其仅包含您指定的元素包含范围。 |
JSON.CLEAR |
清除您指定的路径中的数组或 JSON 对象。 |
JSON.DEBUG |
检索有关 JSON 文档的信息。Memorystore for Valkey
支持以下子命令:
|
JSON.DELJSON.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 |
在 true 和
false 之间切换布尔值。此值存储在您指定的路径中。 |
JSON.TYPE |
检索您指定的路径中的 JSON 值的类型。 |
Memorystore for Valkey 与 JSON 的互动方式
本部分介绍 Memorystore for Valkey 与 JSON 数据类型的互动方式。
多个条件表达式
如果有多个用于过滤的条件表达式,则 Memorystore for Valkey 会按以下顺序对其进行评估:
- 括号内的运算
- 逻辑
AND表达式 (&&) - 逻辑
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.NUMINCRBY 和 JSON.NUMMULTBY
命令与 JSON 数字搭配使用时,适用以下条件:
- 如果两个数字都是整数,并且结果超出
int64的范围,则结果会自动变为 64 位 IEEE 双精度浮点数。 - 如果至少有一个数字是浮点数,则结果为 64 位 IEEE 双精度浮点数。
- 如果结果超出 64 位 IEEE 双精度浮点数的范围,则您会收到
OVERFLOW错误消息。
直接数组
Memorystore for Valkey 会直接过滤数组对象。例如,如果您有
数据,例如
[0,1,2,3] 和路径查询,例如
$[?(@<3)],则 Memorystore for Valkey 会返回
[0,1,2]。对于 {"my_valkey_key":[0,1,2,3]} 等数据和
$.my_valkey_key[?(@<3)]等路径查询,Memorystore for Valkey 也会返回 [0,1,2]。
数组索引
Memorystore for Valkey 允许您对数组使用正索引和负索引。 以下条件适用于这些类型的索引:
- 正索引:数字从数组的开头开始。例如,如果数组的正索引为 3,则 0 查询第一个元素,1 查询第二个元素,2 查询第三个元素。
- 负索引:数字从数组的末尾开始。如果数组的负索引为 3,则 -1 查询第三个元素,-2 查询第二个元素,-3 查询第一个元素。
Memorystore for Valkey 不会向上或向下舍入索引。如果您有一个长度为 3 的数组,并且您调用大于 3 的正索引或小于 -3 的负索引,则 Memorystore for Valkey 不会返回结果。
JSON 路径的语法
您不能对 JSON 路径使用无效的语法。即使具有无效语法的 JSON 路径的子集包含有效路径,此条件也适用。