Redis JSON 数据类型概述 - Amazon MemoryDB for Redis
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Redis JSON 数据类型概述

MemoryDB 支持许多 Redis 命令来处理 JSON 数据类型。以下是 JSON 数据类型的概述以及受支持的 Redis 命令的详细列表。

术语

租期 描述

JSON 文档

指的是 Redis JSON 密钥的值

JSON 值

指的是 JSON 文档的子集,包括表示整个文档的根目录。值可以是容器或容器中的条目

JSON 元素

等同于 JSON 值的

支持的 JSON 标准

JSON 格式符合RFC 7159ECMA-404JSON 数据交换标准。UTF-8统一码支持 JSON 中的文本。

Root 元素

根元素可以是任何 JSON 数据类型。请注意,在早期的 RFC 4627 中,只允许对象或数组作为根值。自 RFC 7159 更新以来,JSON 文档的根目录可以是任何 JSON 数据类型。

文档大小限制

JSON 文档以经过优化的格式存储在内部,可以快速访问和修改。与相同文档的等效序列化表示相比,这种格式通常会消耗更多的内存。单个 JSON 文档消耗的内存限制为 64MB,这是内存中数据结构的大小,而不是 JSON 字符串的大小。JSON 文档使用的内存量可通过使用JSON.DEBUG MEMORY命令。

JSON ACL

  • JSON 数据类型完全集成到中Redis 访问控制列表 (ACL)功能。与现有的每数据类型类别(@string、@hash 等)类似,添加了一个新类别 @json,以简化对 JSON 命令和数据的访问的管理。没有其他现有的 Redis 命令属于 @json 类别。所有 JSON 命令都强制执行任何密钥空间或命令限制和权限。

  • 有五个现有的 Redis ACL 类别已更新为包含新的 JSON 命令:@read、@write、@fast、@slow 和 @admin。下表显示了 JSON 命令到相应类别的映射。

ACL
JSON 命令 @read @write @fast @slow @admin

JSON.ARRAPPEND

y

y

JSON.ARRINDEX

y

y

JSON.ARRINSERT

y

y

JSON.ARRLEN

y

y

JSON.ARRPOP

y

y

JSON.ARRTRIM

y

y

JSON.CLEAR

y

y

JSON.DEBUG

y

y

y

JSON.DEL

y

y

JSON.FORGET

y

y

JSON.GET

y

y

JSON.MGET

y

y

JSON.NUMINCRBY

y

y

JSON.NUMMULTBY

y

y

JSON.OBJKEYS

y

y

JSON.OBJLEN

y

y

JSON.RESP

y

y

JSON.SET

y

y

JSON.STRAPPEND

y

y

JSON.STRLEN

y

y

JSON.STRLEN

y

y

JSON.TOGGLE

y

y

JSON.TYPE

y

y

JSON.NUMINCRBY

y

y

嵌套深度限制

当 JSON 对象或数组的元素本身就是另一个 JSON 对象或数组时,该内部对象或数组被称为 “嵌套” 在外部对象或数组中。最大嵌套深度限制为 128。任何创建包含嵌套深度大于 128 的文档的尝试都将被拒绝,并显示错误。

命令语法

大多数命令要求将 Redis 键名作为第一个参数。有些命令还有 path 参数。如果 path 参数是可选的且未提供,则默认为根。

表示语法:

  • 必需参数括在尖括号内,例如 <key>

  • 可选参数括在方括号内,例如 [path]

  • 其他可选参数由... 表示,例如 [json...]

路径语法

JSON-redis 支持两种路径语法:

  • 增强语法— 遵循描述的 jsonPath 语法Goessner,如下表所示。为了清楚起见,我们对表中的描述进行了重新排序和修改。

  • 受限语法— 具有有限的查询能力。

注意

某些命令的结果对使用哪种类型的路径语法很敏感。

如果查询路径以 '$' 开头,则使用增强的语法。否则,将使用受限语法。

增强语法

符号/表达式样式 描述

$

根元素

. 或 []

子运算符

..

递归式下降

*

通配符。对象或数组中的所有元素。

[]

数组下标运算符。索引从 0 开始。

[,]

UNion 运算符

[start: end: step]

数组切片运算符

?()

将过滤器(脚本)表达式应用于当前数组或对象

()

筛选条件表达式

@

在过滤器表达式中使用,表示当前正在处理的节点

==

等于,在筛选器表达式中使用。

!=

不等于,在筛选器表达式中使用。

>

大于,在筛选器表达式中使用。

>=

大于或等于,在筛选表达式中使用。

<

小于,在筛选器表达式中使用。

<=

小于或等于,在筛选表达式中使用。

&&

逻辑 AND,用于组合多个筛选器表达式。

||

逻辑 OR,用于组合多个筛选器表达式。

示例

以下示例是基于Goessner示例 XML 数据,我们通过添加其他字段对其进行了修改。

{ "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95, "in-stock": true, "sold": true }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99, "in-stock": false, "sold": true }, { "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99, "in-stock": true, "sold": false }, { "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99, "in-stock": false, "sold": false } ], "bicycle": { "color": "red", "price": 19.95, "in-stock": true, "sold": false } } }
路径 描述

$.store.book [*] .author

商店里所有书籍的作者

$。作者

所有作者

$.store。 *

商店的所有成员

$ ["存储"] . *

商店的所有成员

$.store.. price

商店里所有东西的价格

$..*

JSON 结构的所有递归成员

$.. book [*]

所有书籍

$.. book [0]

第一本书

$.. book [-1]

最后一本书

$.. book [0:2]

前两本书

$. book [0,1]

前两本书

$.. book [0:4]

从索引 0 到 3 的图书(不包括结尾索引)

$.. book [0:4:2]

位于索引 0、2 的图书

$.. book [? (@.isbn)]

所有带有 isbn 编号的图书

$.. book [? (@.price<10)]

所有书籍都低于 10 美元

'$.. book [? (@.price < 10)] '

所有书都比10美元便宜。(如果路径包含空格,则必须用引号括起来)

'$.. book [? (@ ["price"] < 10)] '

所有书籍都低于 10 美元

'$.. book [? (@。 ["价格"] < 10)] '

所有书籍都低于 10 美元

$.. book [? (@.price>=10&&@.price<=100)]

价格在 10 美元到 100 美元之间的所有图书(含)

'$.. book [? (@.price>=10 &&@.price<=100)] '

价格在 10 美元到 100 美元之间(含)的所有图书。(如果路径包含空格,则必须用引号括起来)

$.. book [? (@.sold==true||@.in-stock=false)]

所有图书已售出或缺货

'$.. book [? (@.sold == true || @.in-stock == false)] '

所有图书已售出或缺货。(如果路径包含空格,则必须用引号括起来)

'$.store.book [? (@。 ["类别"] == “小说”)] '

小说类中的所有图书

'$.store.book [? (@。 ["类别"]! = “小说”)] '

非小说类的所有图书

更多过滤器表达式示例:

127.0.0.1:6379> JSON.SET k1 . '{"books": [{"price":5,"sold":true,"in-stock":true,"title":"foo"}, {"price":15,"sold":false,"title":"abc"}]}' OK 127.0.0.1:6379> ON.GET k1 $.books[?(@.price>1&&@.price<20&&@.in-stock)] "[{\"price\":5,\"sold\":true,\"in-stock\":true,\"title\":\"foo\"}]" 127.0.0.1:6379> JSON.GET k1 '$.books[?(@.price>1 && @.price<20 && @.in-stock)]' "[{\"price\":5,\"sold\":true,\"in-stock\":true,\"title\":\"foo\"}]" 127.0.0.1:6379> JSON.GET k1 '$.books[?((@.price>1 && @.price<20) && (@.sold==false))]' "[{\"price\":15,\"sold\":false,\"title\":\"abc\"}]" 127.0.0.1:6379> JSON.GET k1 '$.books[?(@.title == "abc")]' [{"price":15,"sold":false,"title":"abc"}] 127.0.0.1:6379> JSON.SET k2 . '[1,2,3,4,5]' 127.0.0.1:6379> JSON.GET k2 $.*.[?(@>2)] "[3,4,5]" 127.0.0.1:6379> JSON.GET k2 '$.*.[?(@ > 2)]' "[3,4,5]" 127.0.0.1:6379> JSON.SET k3 . '[true,false,true,false,null,1,2,3,4]' OK 127.0.0.1:6379> JSON.GET k3 $.*.[?(@==true)] "[true,true]" 127.0.0.1:6379> JSON.GET k3 '$.*.[?(@ == true)]' "[true,true]" 127.0.0.1:6379> JSON.GET k3 $.*.[?(@>1)] "[2,3,4]" 127.0.0.1:6379> JSON.GET k3 '$.*.[?(@ > 1)]' "[2,3,4]"

受限语法

符号/表达式样式 描述

. 或 []

子运算符

[]

数组下标运算符。索引从 0 开始。

示例

路径 描述

.store.book [0] .author

第一本书的作者

.store.book [-1] .author

最后一本书的作者

.adress.city

城市名称

["store"] ["book"] [0] ["title"]

第一本书的标题

["store"] ["book"] [-1] ["title"]

最后一本书的标题

注意

全部Goessner本文档中引用的内容受知识语法.

常见错误前缀

每条错误消息都有一个前缀。以下是常见错误前缀的列表:

Prefix 描述

常规错误

LIMIT

超出大小限制错误。例如,超过文档大小限制或嵌套深度限制

不存在的

键或路径不存在

超出界限

数组索引超出界限

语法错误

语法错误

错误的类型

值类型不正确

JSON 相关指标

提供了以下 JSON 信息指标:

Info 描述

json_total_memory_bytes

分配给 JSON 对象的总内存量

json_num_documents

Redis 中的文档总数

要查询核心指标,请运行 Redis 命令:

info json_core_metrics

MemoryDB 如何与 JSON 交互

以下内容说明了 MemoryDB 如何与 JSON 数据类型进行交互。

运算符优先顺

在评估条件表达式以进行筛选时,&s 优先考虑,然后求值 ||s,这在大多数语言中很常见。括号内的操作将首先执行。

最大路径嵌套限制行为

MemoryDB 的最大路径嵌套限制为 128。所以一个值像$.a.b.c.d...只能达到 128 个等级。

处理数字值

JSON 没有单独的整数和浮点数数据类型。它们都是被叫的号码。

数字语法:

当输入时收到 JSON 数字时,它将转换为两种内部二进制表示形式之一:64 位有符号整数或 64 位 IEEE 双精度浮点数。原始字符串及其任何格式都不会保留。因此,当数字作为 JSON 响应的一部分输出时,它会使用通用格式规则从内部二进制表示形式转换为可打印字符串,这可能会导致生成的字符串与收到的字符串不同。

算运命令NUMINCRBYNUMMULTBY

  • 如果两个数字都是整数,并且结果超出了int64,它将自动变为 64 位 IEEE 双精度浮点数。

  • 如果至少有一个数字是浮点数,则结果将是 64 位 IEEE 双精度浮点数。

  • 如果结果超出 64 位 IEEE double 的范围,则该命令将返回OVERFLOW错误消息。

有关可用命令的详细列表,请参阅。支持的命令.

直接语法

MemoryDB 直接过滤数组对象。

对于类似的数据[0,1,2,3,4,5,6]和类似 $ [? (@<4)],或者类似的数据{"my_key":[0,1,2,3,4,5,6]}还有一个路径查询$.my_key[?(@<4)],在这两种情况下,MemoryDB 都会返回 [1,2,3]。

数组索引行为

MemoryDB 允许数组的正索引和负索引。对于长度为 5 的数组,0 将查询第一个元素,1 将查询第二个元素,依此类推。负数从数组的末尾开始,因此 -1 将查询第五个元素,-2 将查询第四个元素,依此类推。

为了确保客户的行为具有可预测性,MemoryDB 不会向下或向上舍入数组索引,因此,如果您的数组长度为 5,则调用索引 5 或更高、或 -6 或更低的索引将不会产生结果。

严格语法

MemoryDB 不允许使用无效语法的 JSON 路径,即使路径的子集包含有效路径也是如此。这是为了让我们的客户保持正确的行为。