Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Panoramica del tipo di dati JSON di Redis
ElastiCache per Redis supporta una serie di comandi Redis da utilizzare con il tipo di dati JSON. Di seguito è riportata una panoramica del tipo di dati JSON e un elenco dettagliato dei comandi Redis supportati.
Terminology
Termine | Descrizione |
---|---|
Documento JSON |
Si riferisce al valore di una chiave JSON di Redis. |
Valore JSON |
Si riferisce a un sottoinsieme di un documento JSON, inclusa la radice che rappresenta l'intero documento. Un valore può essere un container o una voce vuota in un container. |
Elemento JSON |
Equivalente a un valore JSON. |
Standard JSON supportati
Il formato JSON è compatibile con lo standard di interscambio dati JSON RFC 7159
Elemento radice
L'elemento radice può essere qualsiasi tipo di dati JSON. Tieni presente che nello standard RFC 4627 precedente, come valori radice erano consentiti soo oggetti o array. Dopo l'aggiornamento allo standard RFC 7159, la radice di un documento JSON può essere qualunque tipo di dati JSON.
Limite delle dimensioni del documento
I documenti JSON sono memorizzati internamente in un formato ottimizzato per l’accesso e la modifica rapidi. Questo formato generalmente comporta un consumo di memoria lievemente superiore alla rappresentazione serializzata equivalente dello stesso documento.
Il consumo di memoria di un singolo documento JSON è limitato a 64 MB, cioè la dimensione della struttura dati in memoria, non la stringa JSON. Puoi controllare la quantità di memoria che consuma un documento JSON utilizzando il comando JSON.DEBUG
MEMORY
.
ACL JSON
Simile alle categorie per tipo di dati esistenti (@string, @hash ecc.), viene aggiunta una nuova categoria @json per semplificare la gestione dell'accesso a comandi e dati JSON. Nessun altro comando Redis esistente è membro della categoria @json. Tutti i comandi JSON impongono restrizioni e autorizzazioni per lo spazio delle chiavi o i comandi.
Esistono cinque categorie di ACL Redis esistenti che vengono aggiornate per includere i nuovi comandi JSON: @read, @write, @fast, @slow e @admin. La tabella seguente indica la mappatura dei comandi JSON alle categorie appropriate.
ACL | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Comando 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 |
Limite di profondità di nidificazione
Quando un oggetto o un array JSON ha un elemento che è esso stesso un altro oggetto o array JSON, si dice che tale oggetto o array si nidifica nell'oggetto o nell'array esterno. Il limite massimo di profondità di nidificazione è 128. Qualunque tentativo di creare un documento che contenga una profondità di nidificazione maggiore di 128 verrà rifiutato con un errore.
Sintassi dei comandi
La maggior parte dei comandi richiede un nome chiave Redis come primo argomento. Alcuni comandi hanno anche un argomento path. L'argomento path per impostazione predefinita è la radice se è facoltativo e non viene fornito.
Notazione:
Gli argomenti richiesti sono racchiusi tra parentesi angolari. Esempio: <key>
Gli argomenti facoltativi sono racchiusi tra parentesi quadre. Esempio: [path]
Argomenti facoltativi supplementari sono indicati da un'ellissi ("…"). Esempio: [json...]
Sintassi del percorso
JSON Redis supporta due tipi di sintassi del percorso:
Sintassi avanzata: segue la sintassi JSONPath descritta da Goessner
, come mostrato nella tabella seguente. Abbiamo riordinato e modificato le descrizioni nella tabella per maggiore chiarezza. Sintassi limitata: ha limitate capacità di interrogazione.
Nota
I risultati di alcuni comandi sono sensibili al tipo di sintassi del percorso utilizzata.
Se un percorso di interrogazione inizia con '$', utilizza la sintassi avanzata. In caso contrario, viene utilizzata la sintassi limitata.
Sintassi avanzata
Simbolo/espressione | Descrizione |
---|---|
$ |
Lelemento radice. |
. o [] |
Operatore figlio. |
.. |
Discesa ricorsiva. |
* |
Carattere jolly. Tutti gli elementi di un oggetto o un array. |
[] |
Operatore pedice di un array. L'indice è basato su 0. |
[,] |
Operatore di unione. |
[start:end:step] |
Operatore di sezionamento di un array. |
?() |
Applica un'espressione filtro (script) all'array o all'oggetto corrente. |
() |
Espressione filtro. |
@ |
Utilizzato in espressioni filtro che fanno riferimento al nodo corrente in elaborazione. |
== |
Uguale a, utilizzato in espressioni filtro. |
!= |
Diverso da, utilizzato in espressioni filtro. |
> |
Maggiore di, utilizzato in espressioni filtro. |
>= |
Maggiore o uguale a, utilizzato in espressioni filtro. |
< |
Minore di, utilizzato in espressioni filtro. |
<= |
Mainore o uguale a, utilizzato in espressioni filtro. |
&& |
AND logico, utilizzato per combinare più espressioni filtro. |
|| |
OR logico, utilizzato per combinare più espressioni filtro. |
Examples (Esempi)
Gli esempi seguenti sono basati su dati XML di esempio di Goessner
{ "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 } } }
Path | Descrizione |
---|---|
$.store.book[*].author |
Gli autori di tutti i libri del negozio. |
$..author |
tutti gli autori. |
$.store.* |
Tutti i membri del negozio. |
$["store"].* |
Tutti i membri del negozio. |
$.store..price |
Il prezzo di ogni cosa nel negozio. |
$..* |
Tutti i membri ricorsivi della struttura JSON. |
$..book[*] |
Tutti i libri. |
$..book[0] |
Il primo libro. |
$..book[-1] |
L'ultimo libro. |
$..book[0:2] |
I primi due libri. |
$..book[0,1] |
I primi due libri. |
$..book[0:4] |
Libri dall'indice 0 al 3 (l'indice finale escluso). |
$..book[0:4:2] |
Libri nell’indice 0, 2. |
$..book[?(@.isbn)] |
Tutti i libri con un numero ISBN. |
$..book[?(@.price<10)] |
Tutti i libri che costano meno di 10 euro. |
'$..book[?(@.price < 10)]' |
Tutti i libri che costano meno di 10 euro. (Il percorso deve essere tra virgolette se contiene spazi vuoti.) |
'$..book[?(@["price"] < 10)]' |
Tutti i libri che costano meno di 10 euro. |
'$..book[?(@.["price"] < 10)]' |
Tutti i libri che costano meno di 10 euro. |
$..book[?(@.price>=10&&@.price<=100)] |
Tutti i libri nella fascia di prezzo da 10 a 100 euro, inclusi. |
'$..book[?(@.price>=10 && @.price<=100)]' |
Tutti i libri nella fascia di prezzo da 10 a 100 euro, inclusi. (Il percorso deve essere tra virgolette se contiene spazi vuoti.) |
$..book[?(@.sold==true||@.in-stock==false)] |
Tutti i libri venduti o esauriti. |
'$..book[?(@.sold == true || @.in-stock == false)]' |
Tutti i libri venduti o esauriti. (Il percorso deve essere tra virgolette se contiene spazi vuoti.) |
'$.store.book[?(@.["category"] == "fiction")]' |
Tutti i libri della categoria fiction. |
'$.store.book[?(@.["category"] != "fiction")]' |
Tutti i libri appartenenti a categorie nonfiction. |
Altri esempi di espressioni filtro:
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]"
Sintassi limitata
Simbolo/espressione | Descrizione |
---|---|
. o [] |
Operatore figlio. |
[] |
Operatore pedice di un array. L'indice è basato su 0. |
Examples (Esempi)
Path | Descrizione |
---|---|
.store.book[0].author |
L'autore del primo libro. |
.store.book[-1].author |
L'autore dell’ultimo libro. |
.address.city |
Nome della città. |
["store"]["book"][0]["title"] |
Il titolo del primo libro. |
["store"]["book"][-1]["title"] |
Il titolo dell’ultimo libro. |
Nota
Tutti i contenuti di Goessner
Prefissi di errori comuni
Ogni messaggio di errore ha un prefisso. Di seguito è riportato un elenco di prefissi di errori comuni..
Prefix | Descrizione |
---|---|
ERR |
Un errore generale. |
LIMIT |
Un errore che si verifica quando vengono superati i limiti delle dimensioni. Ad esempio, il limite delle dimensioni del documento o il limite di profondità di nidificazione è stato superato. |
NONEXISTENT |
Una chiave o percorso non esiste. |
OUTOFBOUNDARIES |
Un indice array esterno ai limiti. |
SYNTAXERR |
Errore di sintassi. |
WRONGTYPE |
Tipo di valore errato. |
Metriche correlate a JSON
Di seguito sono fornite le seguenti metriche di informazioni JSON:
Info | Descrizione |
---|---|
json_total_memory_bytes |
Memoria totale allocata agli oggetti JSON. |
json_num_documents |
Numero totale di documenti in Redis. |
Per eseguire interrogazioni di metriche principali, utilizzare il seguente comando Redis:
info json_core_metrics
Modalità di interazione di ElastiCache per Redis con JSON
La sezione seguente descrive la modalità di interazione di ElastiCache per Redis con i tipi di dati JSON.
Precedenza degli operatori
Durante la valutazione delle espressioni condizionali per il filtro, && hanno la precedenza, quindi vengono valutati ||, come nella maggior parte dei linguaggi. Operazioni tra parentesi vengono eseguite per prime.
Comportamento del limite massimo di nidificazione dei percorsi
Il limite massimo di nidificazione dei percorsi in ElastiCache per Redis è 128. Per cui, un valore come $.a.b.c.d...
può raggiungere solo 128 livelli.
Gestione dei valori numerici
JSON non hanno tipi di dati separati per numeri interi e numeri in virgola mobile. Sono tutti definiti “numeri”.
Rappresentazioni numeriche:
Quando un numero JSON viene ricevuto nell’input, viene convertito in una delle due rappresentazioni binarie interne: un numero intero con segno a 64 bit o un numero in virgola mobile a doppia precisione IEEE a 64 bit . La stringa originaria e tutta la formattazione non vengono mantenute. Pertanto, quando un numero viene emesso come parte di una risposta JSON, viene convertito dalla rappresentazione binaria interna in una stringa stampabile che utilizza regole di formattazione generiche. Queste regole potrebbero determinare la generazione di una stringa diversa da quella ricevuta.
Comandi aritmetici NUMINCRBY
e NUMMULTBY
:
Se entrambi i numeri sono interi e il risultato non rientra nell'intervallo
int64
, diventa automaticamente un numero in virgola mobile a doppia precisione IEEE a 64 bit.Se almeno uno dei numeri è in virgola mobile, il risultato è un numero in virgola mobile a doppia precisione IEEE a 64 bit.
Se il risultato supera l'intervallo doppio IEEE a 64 bit, il comando restituisce un errore
OVERFLOW
.
Per un elenco dei comandi disponibili, consulta Comandi JSON di Redis non supportati.
Filtraggio array diretto
ElastiCache per Redis filtra oggetti array direttamente.
Per dati come [0,1,2,3,4,5,6]
e un’interrogazione percorso come $[?(@<4)]
oppure dati come {"my_key":[0,1,2,3,4,5,6]}
e un’interrogazione percorso come$.my_key[?(@<4)]
, ElastiCache per Redis restituisce [1,2,3] in entrambe le circostanze.
Comportamento di indicizzazione array
ElastiCache per Redis consente indici sia positivi che negativi per gli array. Per un array di lunghezza cinque, 0 interroga il primo elemento, 1 il secondo e così via. I numeri negativi iniziano alla fine dell'array, per cui -1 interroga il quinto elemento, -2 il quarto e così via.
Per garantire un comportamento prevedibile per i clienti, ElastiCache per Redis non arrotonda indici array per difetto o per eccesso, per cui avendo un array di lunghezza 5, la chiamata dell'indice 5 o superiore, o -6 o inferiore, non produce risultato.
Valutazione della sintassi rigida
MemoryDBnon consente percorsi JSON con sintassi non valida, neppure se un sottoinsieme del percorso contiene un percorso valido. Ciò permantenere un comportamento corretto per i nostri clienti.