La notación de objetos JavaScript (JSON) te proporciona una forma eficiente de almacenar y manipular datos estructurados en Memorystore para Valkey. 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 ideal para ti. Además, con JSON, puedes codificar conjuntos de datos complejos dentro de las instancias de Memorystore para Valkey sin usar esquemas. Puedes almacenar, acceder y actualizar datos en las instancias, 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 una instancia de Memorystore para Valkey, 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 comandoCONFIG SET json.max-document-size VALUE, donde VALUE es el tamaño máximo del documento. Por ejemplo, si especificas4123456, 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 KEYoMEMORY 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 | Sí | N | N |
JSON.ARRINSERT |
Sí | No | S | S | N | N |
JSON.ARRLEN |
S | S | No | Sí | N | N |
JSON.ARRPOP |
Sí | No | S | S | N | N |
JSON.ARRTRIM |
Sí | No | S | S | N | N |
JSON.CLEAR |
Sí | No | S | S | N | N |
JSON.DEBUG |
S | S | N | N | S | Sí |
JSON.DEL |
S | No | S | S | N | N |
JSON.FORGET |
Sí | No | S | S | N | N |
JSON.GET |
S | S | No | Sí | N | N |
JSON.MGET |
S | S | No | Sí | N | N |
JSON.MSET |
Sí | No | Sí | No | Sí | No |
JSON.NUMINCRBY |
Sí | No | S | S | N | N |
JSON.NUMMULTBY |
Sí | No | S | S | N | N |
JSON.OBJKEYS |
S | S | No | Sí | N | N |
JSON.OBJLEN |
S | S | No | Sí | N | N |
JSON.RESP |
S | S | No | Sí | N | N |
JSON.SET |
Sí | No | Sí | No | Sí | No |
JSON.STRAPPEND |
Sí | No | S | S | N | N |
JSON.STRLEN |
S | S | No | Sí | N | N |
JSON.TOGGLE |
Sí | No | S | S | N | N |
JSON.TYPE |
S | S | No | Sí | 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 Valkey
admite los siguientes subcomandos:
|
JSON.DELJSON.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 Valkey con JSON
En esta sección, se describe cómo interactúa Memorystore para Valkey con el tipo de datos JSON.
Varias expresiones condicionales
Si hay varias expresiones condicionales para el filtrado, Memorystore para Valkey las evalúa en el siguiente orden:
- Operaciones dentro de paréntesis
- La expresión lógica
AND(&&) - 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 Valkey 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 para Valkey 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 Valkey 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 Valkey filtra los objetos de array directamente. Por ejemplo, si tienes datos como
[0,1,2,3] y una consulta de ruta de acceso como$[?(@<3)], Memorystore para Valkey devuelve [0,1,2]. Para datos como {"my_valkey_key":[0,1,2,3]} y una consulta de ruta de acceso como
$.my_valkey_key[?(@<3)], Memorystore for Valkey también devuelve [0,1,2].
Índices de array
Memorystore for Valkey 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 para Valkey 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 Valkey 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.