Acerca de JSON

La notación de objetos JavaScript (JSON) te proporciona una forma eficiente de almacenar y manipular datos estructurados en Memorystore para Redis Cluster. El uso de JSON te brinda los siguientes beneficios:

  • Tener capacidades de búsqueda y filtrado rápidas
  • Realizar actualizaciones in situ en datos JSON sin tener que reemplazar documentos completos
  • Consultar, modificar y administrar estructuras de datos complejas de manera eficiente

Si tus aplicaciones requieren un almacenamiento de datos dinámico y flexible, JSON es la opción ideal para ti. Además, cuando usas JSON, puedes codificar conjuntos de datos complejos dentro de clústeres en Memorystore para Redis Cluster sin usar esquemas. Puedes almacenar, acceder y actualizar datos en los clústeres, y no tienes que administrar código personalizado para serializar y deserializar los datos.

Un documento JSON es un formato de texto legible por humanos para almacenar y transportar datos. Este formato consta de pares clave-valor y tipos de datos estructurados. El formato JSON te permite recuperar y actualizar partes de un documento JSON sin tener que manipular el objeto completo. Esto puede mejorar tu rendimiento y reducir tus costos. Además, el formato JSON cumple con RFC 7159, el estándar de intercambio de datos JSON ECMA-404 y Unicode UTF-8 en texto JSON.

Disponibilidad

Si creas un clúster en Memorystore para Redis Cluster, versión 8.0 y posteriores, la versión 1.0 del tipo de datos JSON y los comandos asociados estarán disponibles automáticamente. Este tipo de datos es compatible con la API de la versión 2 del módulo JSON. Además, según la RFC 7159, el elemento raíz de un documento JSON puede ser de cualquier tipo de datos JSON.

Propiedades de JSON

JSON tiene las siguientes propiedades:

  • Tamaño máximo del documento: Para evitar posibles problemas de memoria insuficiente debido a inserciones maliciosas o sin límites, puedes configurar un límite en el tamaño de las claves JSON individuales.

    De forma predeterminada, el valor de esta propiedad se establece en 0, lo que significa que no hay límite para el tamaño del documento JSON. Para establecer este límite, usa el comando CONFIG SET json.max-document-size VALUE, donde VALUE es el tamaño máximo del documento. Por ejemplo, si especificas 4123456, el tamaño máximo del documento es de 4,123,456 bytes (4 MB).

    Para ver cuánta memoria usa un valor JSON almacenado en una clave especificada, puedes usar los comandos JSON.DEBUG MEMORY KEY o MEMORY USAGE KEY. Para estos comandos, KEY es el nombre de la clave en la que se almacena el valor JSON.

  • Profundidad máxima: Es el nivel máximo de anidamiento para los objetos y arrays JSON. Para obtener más información, consulta Límite de profundidad de anidamiento máximo.

Tamaño del documento JSON

Dado que un documento JSON se almacena internamente en un formato optimizado para el acceso y la modificación rápidos, este tipo de documento puede consumir mucha memoria. Para verificar cuánta memoria consume un documento JSON, usa el comando JSON.DEBUG MEMORY KEY, en el que KEY es el nombre de la clave que contiene el documento.

Categorías de JSON

Para administrar el acceso a los comandos JSON y los datos, usa la categoría @json. Además de esta categoría, las siguientes categorías usan comandos JSON: @read, @write, @fast, @slow y @admin.

En la siguiente tabla, se indica si puedes asignar comandos JSON a las categorías @read, @write, @fast, @slow, @admin y @json.

Comando JSON @json @read @write @fast @slow @admin
JSON.ARRAPPEND Y No S S N N
JSON.ARRINDEX S S No N N
JSON.ARRINSERT No S S N N
JSON.ARRLEN S S No N N
JSON.ARRPOP No S S N N
JSON.ARRTRIM No S S N N
JSON.CLEAR No S S N N
JSON.DEBUG S S N N S
JSON.DEL S No S S N N
JSON.FORGET No S S N N
JSON.GET S S No N N
JSON.MGET S S No N N
JSON.MSET No No No
JSON.NUMINCRBY No S S N N
JSON.NUMMULTBY No S S N N
JSON.OBJKEYS S S No N N
JSON.OBJLEN S S No N N
JSON.RESP S S No N N
JSON.SET No No No
JSON.STRAPPEND No S S N N
JSON.STRLEN S S No N N
JSON.TOGGLE No S S N N
JSON.TYPE S S No N N

Comandos JSON

En esta sección, se enumeran y describen los comandos JSON que puedes usar para realizar operaciones en documentos JSON.

Comando Descripción
JSON.ARRAPPEND Agrega uno o más valores JSON al array en la ruta de acceso.
JSON.ARRINDEX Busca la primera ocurrencia de un valor escalar JSON en un array.
JSON.ARRINSERT Inserta uno o más valores JSON en una ruta de acceso de un array antes del índice que especifiques.
JSON.ARRLEN Recupera la longitud del array JSON en la ruta de acceso.
JSON.ARRPOP Quita y devuelve un elemento de un índice en el array.
JSON.ARRTRIM Recorta un array en la ruta de acceso para que solo contenga el rango inclusivo de elementos que especifiques.
JSON.CLEAR Borra los arrays o un objeto JSON en una ruta que especifiques.
JSON.DEBUG Recupera información sobre un documento JSON. Memorystore for Redis Cluster admite los siguientes subcomandos:
  • MEMORY: Informa el uso de memoria de un valor en bytes.
  • DEPTH: Informa la profundidad máxima de la ruta de un documento JSON.
  • FIELDS: Informa la cantidad de campos dentro de un elemento JSON. Este elemento se almacena en una clave que especificas.
  • HELP: Devuelve información útil sobre el comando JSON.DEBUG.
JSON.DEL
JSON.FORGET
Borra los valores JSON en una ruta de acceso que especifiques.
JSON.GET Devuelve un valor en una ruta de acceso que especificas en formato serializado JSON.
JSON.MGET Devuelve valores en una ruta de acceso que especificas a partir de varias claves de documentos.
JSON.MSET Establece varios valores JSON en una ruta de acceso a varias claves.
JSON.NUMINCRBY Incrementa los valores numéricos almacenados en una ruta de acceso según un número que especifiques.
JSON.NUMMULTBY Multiplica los valores numéricos almacenados en una ruta de acceso por un número que especifiques.
JSON.OBJKEYS Recupera nombres de claves de objetos JSON en una ruta que especifiques.
JSON.OBJLEN Recupera la cantidad de claves en un objeto JSON en una ruta que especifiques.
JSON.RESP Devuelve el valor JSON de una clave en formato del protocolo de serialización de Redis (RESP).
JSON.SET Establece valores JSON en una ruta de acceso que especifiques.
JSON.STRAPPEND Agrega una cadena a cadenas JSON en una ruta de acceso que especifiques.
JSON.STRLEN Recupera la longitud de los valores de cadenas JSON en una ruta de acceso que especifiques.
JSON.TOGGLE Alterna un valor booleano entre true y false. Este valor se almacena en una ruta de acceso que especificas.
JSON.TYPE Recupera el tipo de un valor JSON en una ruta de acceso que especifiques.

Cómo interactúa Memorystore for Redis Cluster con JSON

En esta sección, se describe cómo interactúa Memorystore para Redis Cluster con el tipo de datos JSON.

Varias expresiones condicionales

Si hay varias expresiones condicionales para el filtrado, Memorystore para Redis Cluster las evalúa en el siguiente orden:

  1. Operaciones dentro de paréntesis
  2. La expresión lógica AND (&&)
  3. La expresión lógica OR (||)

Límite de profundidad de anidación máxima

Cuando un objeto o array JSON tiene un elemento que es otro objeto o array JSON, el objeto o array interno se anida dentro del objeto o array externo. El límite máximo de profundidad de anidación es de 128. Por lo tanto, un valor como $.a.b.c.d... solo puede alcanzar 128 niveles.

Si intentas crear un documento JSON que contenga una profundidad de anidación superior a 128, Memorystore para Redis Cluster rechazará el documento y recibirás un error. Sin embargo, puedes ajustar este límite con el comando CONFIG SET json.max-path-limit VALUE, donde VALUE es el límite de profundidad que deseas.

Números JSON

En JSON, tanto los números de punto flotante como los números enteros se denominan números porque tienen el mismo tipo de datos. Cuando Memorystore for Redis Cluster recibe un número JSON, lo convierte en una de las siguientes representaciones binarias internas:

  • Número de punto flotante de doble precisión IEEE de 64 bits
  • Número entero de 64 bits con firma

JSON no conserva la cadena original ni todo su formato. Cuando Memorystore para Redis Cluster genera un número como parte de una respuesta JSON, lo convierte de la representación binaria interna a una cadena imprimible que usa reglas de formato genéricas.

Cuando usas los comandos JSON.NUMINCRBY y JSON.NUMMULTBY con números JSON, se aplican las siguientes condiciones:

  • Si ambos números son enteros y el resultado está fuera del rango de int64, el resultado se convierte automáticamente en un número de punto flotante de doble precisión IEEE de 64 bits.
  • Si al menos uno de los números es un número de punto flotante, el resultado es un número de punto flotante de doble precisión IEEE de 64 bits.
  • Si el resultado supera el rango del número de punto flotante de doble precisión IEEE de 64 bits, recibirás un mensaje de error OVERFLOW.

Arreglos directos

Memorystore for Redis Cluster filtra los objetos de array directamente. Por ejemplo, si tienes datos como
&lbrack;0,1,2,3&rbrack; y una consulta de ruta de acceso como$[?(@<3)], Memorystore for Redis Cluster devuelve &lbrack;0,1,2&rbrack;. Para datos como {"my_valkey_key":[0,1,2,3]} y una consulta de ruta de acceso como
$.my_valkey_key[?(@<3)], Memorystore for Redis Cluster también devuelve &lbrack;0,1,2&rbrack;.

Índices de array

Memorystore for Redis Cluster te permite usar índices positivos y negativos para los arrays. Se aplican las siguientes condiciones a estos tipos de índices:

  • Índice positivo: Los números comienzan al principio del array. Por ejemplo, si un array tiene un índice positivo de tres, 0 consulta el primer elemento, 1 consulta el segundo y 2 consulta el tercero.
  • Índice negativo: Los números comienzan al final del array. Si un array tiene un índice negativo de tres, -1 consulta el tercer elemento, -2 consulta el segundo elemento y -3 consulta el primer elemento.

Memorystore for Redis Cluster no redondea los índices hacia arriba ni hacia abajo. Si tienes un array con una longitud de 3 y llamas a un índice positivo mayor que 3 o a un índice negativo menor que -3, Memorystore para Redis Cluster no devuelve un resultado.

Sintaxis para rutas de acceso JSON

No puedes usar sintaxis no válida para tus rutas de acceso JSON. Esta condición se aplica incluso si un subconjunto de una ruta de acceso JSON con una sintaxis no válida contiene una ruta de acceso válida.