que keys how flushall create cli all nosql redis

nosql - keys - Redis GET contra SQL SELECT



redis create db (1)

Soy bastante nuevo en NoSQL, pero siempre me gustó la idea. Eché un vistazo a Redis y obtuve algunas preguntas sobre las mejores formas de almacenar y recibir múltiples hashes .

Suponiendo el siguiente escenario:

Store a list of objects (redis ''Hashes'') and select them by their timestamp.

Para archivar esto en SQL , requeriría una tabla y dos consultas simples (INSERTAR y SELECCIONAR).

Al intentar hacer esto en Redis , terminé creando la siguiente estructura:

  1. object:$id clave object:$id (hash) que contiene el object
  2. index:timestamp:$id clave index:timestamp:$id score index:timestamp:$id (conjunto ordenado) igual a timestamp y value incluye id

Si bien puedo vivir con el trabajo de mantenimiento adicional de dos claves en lugar de una tabla ( SQL ), tengo curiosidad sobre el proceso de selección de múltiples objetos :

ZRANGEBYSCORE index:timestamp:$id timestampStart timestampEnd

Esto devuelve una array de todos los ID que se crearon entre timestampStart y timestampEnd . Para obtener el objeto en sí, estoy solicitando cada uno de los siguientes:

GET object:$id

  • ¿Es esta la forma correcta de hacerlo?
  • En comparación con una base de datos SQL: ¿sigue siendo apreciablemente más rápida o puede incluso ser más lenta debido a la gran cantidad de GET ?

Un ZRANGEBYSCORE cuesta O(log(N) + M) donde N=|items in your set| y M=|items you''re selecting| . Entonces, hacer las ZRANGEBYSCORE y luego M GET es solo O(long(N)+M+M) = O(log(N)+M) y como máximo será el doble de lento. La red de ida y vuelta podría haber sido una gran desaceleración, pero dado que cada uno de sus intentos es una operación independiente, puede canalizarlos. También puedes poner todo en una secuencia de comandos Lua y solo tener una ida y vuelta, que sería la más óptima. Diría que con 99% de certeza esto sería más rápido que hacer lo mismo en SQL.

Además, si esta es una operación muy frecuente para usted, puede obtener aún más velocidad simplemente almacenando todo el objeto en su conjunto ordenado en lugar de solo el ID. Tendría key = object encoded as json , score = timestamp . Esto le ahorraría O(M) en su operación en términos de que no necesita hacer ningún GET .

Si esta es una buena forma de hacer las cosas realmente depende de su caso de uso. ¿Cuánta velocidad realmente necesita y qué tan importantes son para usted otras características de una base de datos tradicional? Recuerde, Redis es mucho más que una base de datos accesible para los clientes que una base de datos tradicional, y debe almacenar todo en la memoria RAM. Para saber si es lo correcto para usted, necesitamos más información.