JavaScript 对象表示法 (JSON) 可让您在 Memorystore for Redis Cluster 中高效存储和处理结构化数据。使用 JSON 可为您提供以下优势:
- 具备快速搜索和过滤功能
- 对 JSON 数据执行就地更新,而无需覆盖整个文档
- 高效查询、修改和管理复杂的数据结构
如果您的应用需要动态灵活的数据存储,那么 JSON 是您的理想选择。此外,通过使用 JSON,您可以在 Memorystore for Redis Cluster 的集群内对复杂的数据集进行编码,而无需使用架构。您可以存储、访问和更新集群中的数据,而无需管理用于序列化和反序列化数据的自定义代码。
JSON 文档是一种人类可读的文本格式,用于存储和传输数据。此格式包含键值对和结构化数据类型。借助 JSON 格式,您可以检索和更新 JSON 文档的部分内容,而无需处理整个对象。这有助于提升效果并降低费用。此外,JSON 格式还符合 RFC 7159、ECMA-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 类别。除了此类别之外,以下类别也使用 JSON 命令:@read、@write、@fast、@slow 和 @admin。
下表显示了您是否可以将 JSON 命令映射到 @read、@write、@fast、@slow、@admin 和 @json 类别。
| JSON 命令 | @json |
@read |
@write |
@fast |
@slow |
@admin |
|---|---|---|---|---|---|---|
JSON.ARRAPPEND |
是 | 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 | 是 | 否 | 否 |
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 Redis Cluster
支持以下子命令:
|
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 Redis Cluster 如何与 JSON 交互
本部分介绍了 Memorystore for Redis Cluster 如何与 JSON 数据类型互动。
多个条件表达式
如果有多个过滤条件表达式,Memorystore for Redis Cluster 会按以下顺序对其进行评估:
- 括号内的运算
- 逻辑
AND表达式 (&&) - 逻辑
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.NUMINCRBY 和 JSON.NUMMULTBY 命令与 JSON 数字搭配使用时,以下条件适用:
- 如果两个数字都是整数,且结果超出
int64的范围,则结果会自动变为 64 位 IEEE 双精度浮点数。 - 如果至少有一个数字是浮点数,则结果为 64 位 IEEE 双精度浮点数。
- 如果结果超出 64 位 IEEE 双精度浮点数的范围,您会收到
OVERFLOW错误消息。
直接数组
Memorystore for Redis Cluster 直接过滤数组对象。例如,如果您有
[0,1,2,3]之类的数据和 $[?(@<3)] 之类的路径查询,则 Memorystore for Redis Cluster 会返回 [0,1,2]。对于 {"my_valkey_key":[0,1,2,3]} 等数据和
$.my_valkey_key[?(@<3)] 等路径查询,Memorystore for Redis Cluster 也会返回 [0,1,2]。
数组索引
借助 Memorystore for Redis Cluster,您可以对数组使用正索引和负索引。以下条件适用于这些类型的索引:
- 正向索引:数字从数组的开头开始。例如,如果数组的正索引为 3,则 0 查询第一个元素,1 查询第二个元素,2 查询第三个元素。
- 负索引:数字从数组的末尾开始。如果数组的负索引为 3,则 -1 查询第三个元素,-2 查询第二个元素,-3 查询第一个元素。
Memorystore for Redis Cluster 不会向上或向下舍入指数。如果您有一个长度为 3 的数组,并且您调用的正索引大于 3 或负索引小于 -3,则 Memorystore for Redis Cluster 不会返回结果。
JSON 路径的语法
您不能为 JSON 路径使用无效的语法。即使语法无效的 JSON 路径的子集包含有效路径,此条件也适用。