sql >> Base de Datos >  >> NoSQL >> Redis

Redis strings vs Redis hashes para representar JSON:¿eficiencia?

Este artículo puede proporcionar mucha información aquí:http://redis.io/topics/memory-optimization

Hay muchas formas de almacenar una matriz de objetos en Redis (spoiler :Me gusta la opción 1 para la mayoría de los casos de uso):

  1. Almacene todo el objeto como una cadena codificada en JSON en una sola clave y realice un seguimiento de todos los objetos usando un conjunto (o una lista, si es más apropiado). Por ejemplo:

    INCR id:users
    SET user:{id} '{"name":"Fred","age":25}'
    SADD users {id}
    

    En términos generales, este es probablemente el mejor método en la mayoría de los casos. Si hay muchos campos en el Objeto, sus Objetos no están anidados con otros Objetos y tiende a acceder solo a un pequeño subconjunto de campos a la vez, podría ser mejor optar por la opción 2.

    Ventajas :considerado una "buena práctica". Cada objeto es una clave Redis completa. El análisis de JSON es rápido, especialmente cuando necesita acceder a muchos campos para este objeto a la vez. Desventajas :más lento cuando solo necesita acceder a un solo campo.

  2. Almacene las propiedades de cada objeto en un hash de Redis.

    INCR id:users
    HMSET user:{id} name "Fred" age 25
    SADD users {id}
    

    Ventajas :considerado una "buena práctica". Cada objeto es una clave Redis completa. No es necesario analizar cadenas JSON. Desventajas :posiblemente más lento cuando necesita acceder a todos/la mayoría de los campos en un Objeto. Además, los Objetos anidados (Objetos dentro de Objetos) no se pueden almacenar fácilmente.

  3. Almacene cada objeto como una cadena JSON en un hash de Redis.

    INCR id:users
    HMSET users {id} '{"name":"Fred","age":25}'
    

    Esto le permite consolidar un poco y usar solo dos claves en lugar de muchas claves. La desventaja obvia es que no puede establecer el TTL (y otras cosas) en cada objeto de usuario, ya que es simplemente un campo en el hash de Redis y no una clave de Redis completa.

    Ventajas :El análisis de JSON es rápido, especialmente cuando necesita acceder a muchos campos para este Objeto a la vez. Menos "contaminación" del espacio de nombres de la clave principal. Desventajas :Aproximadamente el mismo uso de memoria que el n. ° 1 cuando tiene muchos objetos. Más lento que el n. ° 2 cuando solo necesita acceder a un solo campo. Probablemente no se considere una "buena práctica".

  4. Almacena cada propiedad de cada Objeto en una clave dedicada.

    INCR id:users
    SET user:{id}:name "Fred"
    SET user:{id}:age 25
    SADD users {id}
    

    Según el artículo anterior, esta opción es casi nunca preferido (a menos que la propiedad del Objeto necesite tener un TTL específico o algo así).

    Ventajas :las propiedades de los objetos son claves de Redis completas, que pueden no ser excesivas para su aplicación. Desventajas :lento, usa más memoria y no se considera "mejor práctica". Mucha contaminación del espacio de nombres de la clave principal.

Resumen general

La opción 4 generalmente no se prefiere. Las opciones 1 y 2 son muy similares y ambas son bastante comunes. Prefiero la opción 1 (en términos generales) porque te permite almacenar Objetos más complicados (con múltiples capas de anidamiento, etc.) La opción 3 se usa cuando realmente te importa sobre no contaminar el espacio de nombres de la clave principal (es decir, no desea que haya muchas claves en su base de datos y no le importan cosas como TTL, fragmentación de claves o lo que sea).

Si me equivoqué en algo aquí, considere dejar un comentario y permitirme revisar la respuesta antes de votar negativamente. ¡Gracias! :)