Visão geral do tipo de dados do JSON - Amazon ElastiCache

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Visão geral do tipo de dados do JSON

ElastiCache suporta vários comandos Valkey e Redis OSS para trabalhar com o tipo de dados JSON. Veja a seguir uma visão geral do tipo de dados do JSON e uma lista detalhada dos comandos que são compatíveis.

Terminologia

Prazo Descrição

Documento JSON

Refere-se ao valor de uma chave do JSON.

Valor JSON

Refere-se a um subconjunto de um documento JSON, incluindo a raiz que representa o documento inteiro. Um valor poderia ser um contêiner ou uma entrada dentro de um contêiner.

Elemento JSON

Equivalente ao valor JSON.

Padrão compatível com JSON

O formato JSON é compatível com os padrão de intercâmbio de dados do JSON RFC 7159 e ECMA-404. O padrão UTF-8 Unicode é compatível com texto do JSON.

Elemento raiz

O elemento raiz pode ser de qualquer tipo de dados do JSON. Observe que na RFC 4627 anterior, somente objetos ou matrizes eram permitidos como valores raiz. Desde a atualização para o RFC 7159, a raiz de um documento JSON pode ser de qualquer tipo de dados do JSON.

Limite de tamanho de documentos

Os documentos JSON são armazenados internamente em um formato que é otimizado para rápido acesso e modificação. Esse formato normalmente resulta no consumo um pouco maior de memória do que a representação serializada equivalente do mesmo documento.

O consumo de memória por um único documento JSON é limitado a 64 MB, que é o tamanho da estrutura de dados na memória, não a string JSON. É possível verificar a quantidade de memória consumida por um documento JSON usando o comando JSON.DEBUG MEMORY.

JSON ACLs

  • Semelhante às categorias existentes por tipo de dados (@string, @hash etc.), uma nova categoria @json foi adicionada para simplificar o gerenciamento do acesso a comandos e dados do JSON. Nenhum outro comando do Valkey ou Redis OSS existente é membro da categoria @json. Todos os comandos JSON impõem restrições e permissões de keyspace ou de comando.

  • Existem cinco categorias existentes de ACL do Valkey e do Redis OSS que foram atualizadas para incluir os novos comandos JSON: @read, @write, @fast, @slow e @admin. A tabela a seguir indica o mapeamento de comandos JSON para as categorias apropriadas.

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 de profundidade de aninhamento

Quando um objeto ou matriz JSON tem um elemento que é outro objeto ou matriz JSON, diz-se que esse objeto interno ou matriz se “aninha” dentro do objeto ou matriz externa. O limite máximo de profundidade de aninhamento é 128. Qualquer tentativa de criar um documento que contenha uma profundidade de aninhamento maior que 128 será rejeitada com um erro.

Sintaxe de comando

A maioria dos comandos exige um nome de chave como primeiro argumento. Alguns comandos também têm um argumento path (caminho). O argumento path (caminho) será padronizado para a raiz se for opcional e não fornecido.

Notação:

  • Os argumentos obrigatórios são colocados entre colchetes angulares. Por exemplo: <key>

  • Os argumentos opcionais são colocados dentro de colchetes. Por exemplo: [path]

  • Os argumentos opcionais adicionais são indicados por reticências (“...”). Por exemplo: [json...]

Sintaxe de caminho

O JSON do Redis oferece suporte a dois tipos de sintaxes de path:

  • Sintaxe aprimorada — segue a JSONPath sintaxe descrita por Goessner, conforme mostrado na tabela a seguir. Reordenamos e modificamos as descrições na tabela para maior clareza.

  • Sintaxe restrita - Tem recursos de consulta limitados.

nota

Os resultados de alguns comandos são sensíveis ao tipo de sintaxe de caminho usado.

Se um caminho de consulta começar com '$', ele usará a sintaxe aprimorada. Caso contrário, a sintaxe restrita será usada.

Sintaxe aprimorada

Símbolo/Expressão Descrição

$

O elemento raiz.

. ou []

Operador filho.

..

Descida recursiva.

*

Curinga. Todos os elementos em um objeto ou matriz.

[]

Operador subscrito de matriz. O índice é baseado em 0.

[,]

Operador da união.

[start:end:step]

Operador de matriz slice.

?()

Aplica uma expressão de filtro (script) à matriz ou objeto atual.

()

Expressão de filtro.

@

Usado em expressões de filtro que consultam o nó atual que está sendo processado.

==

Igual a, usado em expressões de filtro.

!=

Não é igual a, usado em expressões de filtro.

>

Maior que, usado em expressões de filtro.

>=

Maior que ou igual a, usado em expressões de filtro.

<

Menor que, usado em expressões de filtro.

<=

Menor que ou igual a, usado em expressões de filtro.

&&

AND lógico, usado para combinar várias expressões de filtro.

||

OR lógico, usado para combinar várias expressões de filtro.

Exemplos

Os exemplos a seguir têm como base o exemplo de dados XML de Goessner, que modificamos acrescentando campos adicionais.

{ "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 Descrição

$.store.book[*].author

Os autores de todos os livros da loja.

$..author

Todos os autores.

$.store.*

Todos os membros da loja.

$["store"].*

Todos os membros da loja.

$.store..price

O preço de tudo na loja.

$..*

Todos os membros recursivos da estrutura JSON.

$..book[*]

Todos os livros.

$..book[0]

O primeiro livro.

$..book[-1]

O último livro.

$..book[0:2]

Os dois primeiros livros.

$..book[0,1]

Os dois primeiros livros.

$..book[0:4]

Livros do índice 0 a 3 (o índice final não é inclusivo).

$..book[0:4:2]

Livros no índice 0, 2.

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

Todos os livros com um número ISBN.

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

Todos os livros mais baratos que US$ 10.

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

Todos os livros são mais baratos do que US$ 10. (O caminho deverá estar entre aspas se contiver espaços em branco.)

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

Todos os livros mais baratos que US$ 10.

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

Todos os livros mais baratos que US$ 10.

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

Todos os livros na faixa de preço entre US$ 10 a US$ 100, inclusive.

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

Todos os livros na faixa de preço entre US$ 10 a US$ 100, inclusive. (O caminho deverá estar entre aspas se contiver espaços em branco.)

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

Todos os livros vendidos ou esgotados.

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

Todos os livros vendidos ou esgotados. (O caminho deverá estar entre aspas se contiver espaços em branco.)

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

Todos os livros na categoria ficção.

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

Todos os livros nas categorias não ficção.

Exemplos adicionais de expressões de 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]"

Sintaxe restrita

Símbolo/Expressão Descrição

. ou []

Operador filho.

[]

Operador subscrito de matriz. O índice é baseado em 0.

Exemplos

Path Descrição

.store.book[0].author

O autor do primeiro livro.

.store.book[-1].author

O autor do último livro.

.address.city

Nome da cidade.

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

O título do primeiro livro.

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

O título do último livro.

nota

Todo conteúdo de Goessner citado nesta documentação está sujeito à Licença da Creative Commons.

Prefixos de erro comuns

Cada mensagem de erro tem um prefixo. Veja a seguir uma lista de prefixos de erro comuns.

Prefixo Descrição

ERR

Um erro geral.

LIMIT

Um erro que ocorre quando o limite de tamanho é excedido. Por exemplo, o limite de tamanho do documento ou limite de profundidade de aninhamento estava excedido.

NONEXISTENT

Uma chave ou caminho não existe.

OUTOFBOUNDARIES

Índice de matriz fora dos limites.

SYNTAXERR

Erro de sintaxe.

WRONGTYPE

Tipo de valor errado.

Métricas relacionadas ao JSON

As seguintes métricas de informações JSON são fornecidas:

Informações Descrição

json_total_memory_bytes

Memória total alocada para objetos JSON.

json_num_documents

Número total de documentos no Valkey ou Redis OSS.

Para consultar as métricas principais, execute o seguinte comando:

info json_core_metrics

Como, ElastiCache para Valkey e Redis, o OSS interage com o JSON

A seção a seguir descreve como, ElastiCache para Valkey e Redis, o OSS interage com o tipo de dados JSON.

Precedência do operador

Ao avaliar expressões condicionais para filtragem, &&s têm precedência primeiro e, em seguida, ||s são avaliadas, como é comum na maioria das linguagens. As operações dentro de parênteses são executadas primeiro.

Comportamento do limite máximo de aninhamento de caminho

O limite máximo de aninhamento de caminhos no ElastiCache Redis OSS é 128. Por isso, um valor como $.a.b.c.d... só pode atingir 128 níveis.

Processamento de valores numéricos

O JSON não tem tipos de dados separados para números inteiros e de ponto flutuante. Todos eles são chamados de números.

Representações numéricas:

Quando um número JSON é recebido na entrada, ele é convertido em uma das duas representações binárias internas: um valor inteiro com sinal de 64 bits ou um ponto flutuante de fluxo de precisão dupla de IEEE de 64 bits. A string original e toda a sua formatação não serão retidas. Dessa forma, quando um número é gerado como parte de uma resposta JSON, ele é convertido da representação binária interna para uma string imprimível que usa regras genéricas de formatação. Essas regras podem resultar em uma string diferente da que foi recebida.

Comandos aritméticos NUMINCRBY e NUMMULTBY:

  • Se ambos os números forem inteiros e o resultado estiver fora da faixa de int64, ele se tornará automaticamente um número IEEE de ponto flutuante de precisão dupla de 64 bits.

  • Se pelo menos um dos números for um ponto flutuante, o resultado será um número IEEE ponto flutuante de precisão dupla de 64 bits.

  • Se o resultado exceder a faixa de 64 bits IEEE dupla, o comando OVERFLOW retornará um erro.

Para obter uma lista detalhada dos comandos disponíveis, consulte Comandos compatíveis do Valkey e do Redis OSS.

Filtragem direta de matriz

ElastiCache para Valkey ou Redis, o OSS filtra objetos de matriz diretamente.

Para dados como [0,1,2,3,4,5,6] e uma consulta de caminho$[?(@<4)], ou dados como {"my_key":[0,1,2,3,4,5,6]} e uma consulta de caminho como$.my_key[?(@<4)], ElastiCache retornaria [1,2,3] em ambas as circunstâncias.

Comportamento de indexação de matriz

ElastiCache para Valkey ou Redis, o OSS permite índices positivos e negativos para matrizes. Para uma matriz de comprimento cinco, 0 consultaria o primeiro elemento, 1 o segundo, e assim por diante. Números negativos começam no fim da matriz, então -1 consultaria o quinto elemento, -2 o quarto elemento e assim por diante.

Para garantir um comportamento previsível para os clientes, ElastiCache não arredonda os índices de matriz para baixo ou para cima. Portanto, se você tiver uma matriz com um comprimento de 5, chamar o índice 5 ou superior, ou -6 ou inferior, não produziria um resultado.

Avaliação estrita da sintaxe

MemoryDB não permite caminhos JSON com sintaxe inválida, mesmo que um subconjunto do caminho contenha um caminho válido. Isso acontece para manter o comportamento correto para nossos clientes.