根元素可以是任何 JSON 数据类型。请注意,在早期的 RFC 4627 中,只允许将对象或数组作为根值。自 RFC 7159 更新以来,JSON 文档的根目录可以是任何 JSON 数据类型。
文档大小限制
JSON 文档以针对快速访问和修改而优化的格式在内部存储。此格式通常会导致比同一文档的等效序列化表示使用稍多的内存。
单个 JSON 文档的内存使用限制为 64 MB,这是内存中数据结构的大小,而不是 JSON 字符串的大小。您可以使用
JSON.DEBUG
MEMORY
命令检查 JSON 文档所使用的内存量。
json ACLs
-
与现有的每数据类型类别(@string、@hash 等)类似,添加了一个新的类别 @json,以简化对 JSON 命令和数据的访问管理。没有其他现有的 Valkey 或 Redis OSS 命令属于 @json 类别。所有 JSON 命令均强制执行任何键空间或命令限制和权限。
-
有五个现有的 Valkey 和 Redis OSS ACL 类别已更新为包含新 JSON 命令:@read、@write、@fast、@slow 和 @admin。下表指示 JSON 命令到相应类别的映射。
JSON 命令
@read
@write
@fast
@slow
@admin
嵌套深度限制
当 JSON 对象或数组有一个元素本身就是其他 JSON 对象或数组时,该内部对象或数组被称为“嵌套”在外部对象或数组中。最大嵌套深度上限为 128。任何创建包含嵌套深度大于 128 的文档的尝试都将被拒绝,并出现错误。
大多数命令均要求将键名称作为第一个参数。某些命令还带有一个路径参数。如果该路径参数是可选的且未提供,则默认为根目录。
如果查询路径以“$”开头,则使用的是增强的语法。否则使用的是受限的语法。
增强的语法
符号/表达式
其他筛选表达式示例:
127.0.0.1:6379> JSON.SET k1 . '{"books": [{"price":5,"sold":true,"in-stock":true,"title":"foo"}, {"price":15,"sold":false,"title":"abc"}]}'
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 && @.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]'
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]"
受限的语法
符号/表达式
数字的表示形式:
当在输入时接收 JSON 数字时,它会转换为两种内部二进制表示之一:64 位有符号整数或 64 位 IEEE 双精度浮点。不保留原始字符串及其所有格式。因此,当数字作为 JSON 响应的一部分输出时,它会从内部二进制表示转换为使用通用格式规则的可打印字符串。这些规则可能会导致生成的字符串与收到的字符串不同。
算术命令
NUMINCRBY
和
NUMMULTBY
:
-
如果两个数字都是整数并且结果超出
int64
的范围,则它会自动变成一个 64 位 IEEE 双精度浮点数。
-
如果至少有一个数字是浮点,则结果是 64 位 IEEE 双精度浮点数。
-
如果结果超出 64 位 IEEE 双精度值的范围,则该命令将返回
OVERFLOW
错误。
有关可用命令的详细列表,请参阅
支持的 Valkey 和 Redis OSS 命令
。
数组索引行为
ElastiCache 对于 Valkey 或 Redis,OSS 允许数组同时使用正索引和负索引。对于长度为 5 的数组,0 将查询第一个元素,1 将查询第二个元素,依此类推。负数从数组的末尾开始,因此 -1 将查询第五个元素,-2 将查询第四个元素,依此类推。
为确保客户行为可预测, ElastiCache 不要向下或向上舍入数组索引,因此,如果您的数组长度为 5,则调用索引 5 或更高、-6 或更低的索引,将不会产生结果。