Panoramica del tipo di dati JSON di Redis - Amazon ElastiCache per Redis

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 e ECMA-404. Nel testo JSON è supportato Unicode UTF-8.

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, che abbiamo modificato aggiungendo campi supplementari.

{ "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 citati in questa documentazione sono soggetti alla Creative Commons License.

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.