紅色的 OSS JSON 資料類型概觀 - Amazon MemoryDB

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

紅色的 OSS JSON 資料類型概觀

記憶體資料庫支援使用 JSON 資料類型的數目 Redis 的 OSS 命令。以下是 JSON 資料類型的概觀,以及支援的 Redis OSS 命令的詳細清單。

術語

術語 描述

JSON 文件

指的是一個紅色的操作系統 JSON 密鑰的值

JSON 值

指的是 JSON 文檔的子集,包括代表整個文檔的根。值可以是容器或容器中的條目

JSON 元素

相當於 JSON 值

支援的 JSON 標準

JSON 格式符合 RFC 7159ECMA-404 JSON 資料交換標準。支援 JSON 文字中的 UTF-8 Unicode

根元素

根元素可為任何 JSON 資料類型。請注意,在舊版 RFC 4627 中,只允許將物件或陣列當作根值。由於更新至 RFC 7159,JSON 文件的根可為任何 JSON 資料類型。

文件大小限制

JSON 文件以針對快速存取和修改進行最佳化的格式儲存在內部。這種格式通常會導致消耗更多的記憶體,而不是相同文件的對等序列化表示。單個 JSON 文檔的內存消耗限制為 64MB,這是內存中數據結構的大小,而不是 JSON 字符串。使用JSON.DEBUG MEMORY命令可以檢查 JSON 文檔消耗的內存量。

JSON ACL

  • JSON 資料類型已完全整合至 Redis 的存取控制清單 (ACL) 功能中。與現有的每個資料類型類別 (@string、@hash 等) 類似,會新增一個新類別 @json,以簡化對 JSON 命令和資料的存取管理作業。沒有其他現有的 Redis OSS 命令是 @json 類別的成員。所有 JSON 命令都會強制執行任何索引鍵空間或命令限制和許可。

  • 現有五個 Redis 的 OSS 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 OSS 鍵名稱作為第一個引數。部分命令也有路徑引數。如果 path 引數是可選的且未提供,則預設為 root。

標記法:

  • 必要的引數用尖括號括起來,例如 <key>

  • 可選參數用方括號括起來,例如 [path]

  • 其他可選參數由... 表示,例如 [json...]

路徑語法

JSON-雷迪斯 OSS 支持兩種路徑語法:

  • 增強的語法 — 遵循戈斯納描述的 JSONPath 語法,如下表所示。為清楚說明,我們重新排序並修改表格中的描述。

  • 受限語法 – 查詢功能有限。

注意

某些命令的結果是敏感的,使用哪種類型的路徑語法。

如果查詢路徑以 '$' 開頭,它會使用增強型語法。否則,將使用受限語法。

增強的語法

符號/表達式 描述

$

根元素

. 或 []

子操作員

..

遞歸下降

*

萬用字元。物件或陣列中的所有元素。

[]

數組下標運算符。索引以 0 為基礎。

[,]

聯合運營商

[start:end:step]

陣列切片運算子

?()

將濾鏡 (Script) 運算式套用至目前的陣列或物件

()

篩選表示式

@

用於參照正在處理的當前節點的過濾器表達式

==

等於,用於篩選器運算式。

!=

不等於,用於篩選器運算式。

>

大於,用於篩選器運算式。

>=

大於或等於,用於篩選器運算式。

<

小於,用於篩選器運算式。

<=

小於或等於,用於篩選器運算式。

&&

邏輯 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

商店中所有書籍的作者

$..author

所有作者

$.store.*

商店的所有成員

$["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[?(@.["price"] < 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[?(@.["category"] == "fiction")]'

小說類別中的所有書籍

'$.store.book[?(@.["category"] != "fiction")]'

非小說類別的所有書籍

更多過濾器表達式示例:

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> 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]' 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

最後一本書的作者

.address.city

城市名稱

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

第一本書的標題

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

最後一本書的標題

注意

本文件中引用的所有 Goessner 內容均受創用 CC 授權規範。

常見錯誤字首

每個錯誤訊息都有一個字首。以下是常見錯誤前綴的列表:

字首 描述

ERR

一般錯誤

LIMIT

超出大小限制錯誤。例如,超出文件大小限制或巢狀深度限制

NONEXISTENT

鍵或路徑不存在

OUTOFBOUNDARIES

數組索引超出界限

SYNTAXERR

語法錯誤

WRONGTYPE

錯誤的值類型

JSON 相關指標

提供下列 JSON 資訊指標:

Info 描述

json_total_memory_bytes

分配給 JSON 物件的總記憶體

json_num_documents

在 Redis 的 OSS 中的文檔總數

若要查詢核心度量,請執行 Redis OSS 命令:

info json_core_metrics

內存數據庫如何與 JSON 交互

下面說明了記憶數據庫如何與 JSON 數據類型進行交互。

運算子優先順序

評估用於篩選的條件表達式時,&& 優先,然後評估 ||,就像大多數語言一樣。括號內的操作將首先執行。

路徑巢狀上限行為

記憶體資料庫的最大路徑巢狀限制為 128。$.a.b.c.d... 等值只能達到 128 個等級。

處理數值

JSON 對整數和浮點數沒有單獨的數據類型。均稱為數字。

當接收到 JSON 號碼時,它會以兩種格式之一存儲。如果該數字符合 64 位有符號整數,則將其轉換為該格式;否則,它將被存儲為字符串。對兩個 JSON 數字(例如 JSON.NUMINCRBY 和 JSON.NUMMULTBY)進行的算術運算試圖保持盡可能多的精度。如果兩個操作數和結果值適合 64 位有符號整數,則執行整數算術。否則,輸入操作數被轉換為 64 位 IEEE 雙精度浮點數,執行算術運算,並將結果轉換回字符串。

算術命令 NUMINCRBYNUMMULTBY

  • 如果兩個數字都是整數,並且結果超出 int64 的範圍,它將自動成為雙精度浮點數。

  • 如果至少有一個數字是浮點數,則結果將是一個雙精度浮點數。

  • 如果結果超出 double 的範圍,該命令將返回一個OVERFLOW錯誤。

注意

在 Redis OSS 引擎 6.2.6.R2 版本之前,當輸入時接收到 JSON 數字時,它會轉換為兩個內部二進制表示之一:64 位有符號整數或 64 位 IEEE 雙精度浮點。不會保留原始字串和全部格式化。因此,數字當作 JSON 回應的一部分輸出時,會從內部二進位表示法,轉換為使用一般格式化規則的可列印字串。這些規則可能導致產生的字串與接收的字串不同。

  • 如果兩個數字都是整數,且結果超出 int64 範圍,會自動變成 64 位元 IEEE 雙精確度浮點數。

  • 如果其中至少一個數字是浮點數,結果會是 64 位元 IEEE 雙精確度浮點數。

  • 如果結果超過 64 位元 IEEE 雙精確度範圍,命令會傳回 OVERFLOW 錯誤。

如需可用命令的詳細清單,請參閱支援的命令

嚴格語法評估

即使路徑的子集包含有效路徑,MemoryDB 也不允許使用無效語法的 JSON 路徑。這是為了我們的客戶保持正確行為。