¿Cuál es el punto de múltiples bases de datos Redis?

159

Entonces, he llegado a un lugar donde quería segmentar los datos que almaceno en redis en bases de datos separadas, ya que a veces necesito usar el comando de teclas en un tipo específico de datos, y quería separarlos para hacerlo más rápido .

Si segmento en varias bases de datos, todo sigue siendo de un solo subproceso, y todavía solo puedo usar un núcleo. Si solo lanzo otra instancia de Redis en el mismo cuadro, puedo usar un núcleo adicional. Además de eso, no puedo nombrar las bases de datos de Redis ni darles ningún tipo de identificador más lógico. Entonces, con todo eso dicho, ¿por qué / cuándo querría usar múltiples bases de datos Redis en lugar de simplemente activar una instancia adicional de Redis para cada base de datos adicional que quiero? Y en relación, ¿por qué Redis no intenta utilizar un núcleo adicional para cada base de datos adicional que agrego? ¿Cuál es la ventaja de tener un solo subproceso en las bases de datos?

Eli
fuente
en su aplicación Node.js, haga esto ---> module.exports = {"1": "su nombre para redis db one", "2": "su nombre para redis db two", "3": "su nombre para redis db three "} etc., o cambie las claves y los valores, lo que necesite
Alexander Mills
1
En Redis 2.8.0 y versiones posteriores, se recomienda que use SCAN en lugar de KEYS, ya que itera sobre un pequeño número de elementos a la vez (por lo tanto, no bloquea el servidor durante largos períodos de tiempo).
TryHarder

Respuestas:

85

En principio, las bases de datos Redis en la misma instancia no son diferentes a los esquemas en las instancias de la base de datos RDBMS.

Entonces, con todo eso dicho, ¿por qué / cuándo querría usar múltiples bases de datos Redis en lugar de simplemente activar una instancia adicional de Redis para cada base de datos adicional que quiero?

Hay una clara ventaja de usar bases de datos redis en la misma instancia de redis, y es la administración. Si activa una instancia separada para cada aplicación, y digamos que tiene 3 aplicaciones, son 3 instancias de redis separadas, cada una de las cuales probablemente necesitará un esclavo para HA en producción, por lo que son 6 instancias totales. Desde el punto de vista de la administración, esto se vuelve muy rápido porque necesita monitorearlos a todos, hacer actualizaciones / parches, etc. Si no planea sobrecargar Redis con E / S alta, una sola instancia con un esclavo es más simple y más fácil de administrar siempre que cumpla con su SLA.

rafiano
fuente
25
Múltiples instancias de Redis es siempre el camino a seguir. Período. Ejecute consultas paralelas para diferentes datos. Si su canalización CICD no crea clústeres de caché para usted, corríjalo, en lugar de .....
Entiende
3
Esto no aborda los puntos de OP: (1) ¿por qué Redis no intenta utilizar un núcleo adicional para cada base de datos adicional? (2) ¿Cuál es la ventaja de tener un solo subproceso en las bases de datos?
ives
93

No desea utilizar varias bases de datos en una sola instancia de redis. Está en desuso y, como notó, varias instancias le permiten aprovechar múltiples núcleos. Si utiliza la selección de la base de datos, tendrá que refactorizar al actualizar. Monitorear y administrar múltiples instancias no es difícil ni doloroso.

De hecho, obtendría métricas mucho mejores en cada base de datos mediante la segregación basada en la instancia. Cada instancia tendrá estadísticas que reflejen ese segmento de datos, lo que puede permitir un mejor ajuste y un monitoreo más receptivo y preciso. Use una versión reciente y separe sus datos por instancia.

Como dijo Jonaton, no use el comando de teclas. Encontrará un rendimiento mucho mejor si simplemente crea un índice clave. Siempre que agregue una clave, agregue el nombre de la clave a un conjunto. El comando de teclas no es terriblemente útil una vez que se escala, ya que tomará mucho tiempo volver.

Deje que el patrón de acceso determine cómo estructurar sus datos en lugar de almacenarlos de la manera que usted cree que funcionan y luego trabajar sobre cómo acceder y picarlos más tarde. Verá un rendimiento mucho mejor y encontrará que el código que consume datos a menudo es mucho más limpio y simple.

Con respecto a un solo subproceso, tenga en cuenta que redis está diseñado para la velocidad y la atomicidad. Claro que las acciones que modifican datos en una base de datos no necesitan esperar en otra base de datos, pero ¿qué sucede si esa acción se guarda en el archivo de volcado o procesa transacciones en esclavos? En ese punto, comienza a meterse en la maleza de la programación de concurrencia.

Al usar varias instancias, convierte la complejidad de subprocesos múltiples en un sistema de estilo de paso de mensajes más simple.

El verdadero proyecto de ley
fuente
57
¿El uso de múltiples bases de datos está en desuso? ¿Puede proporcionar una referencia para esa declaración por favor? Soy consciente de que múltiples bases de datos no son compatibles con Redis Cluster, pero tampoco hay comandos complejos de múltiples teclas y no están en desuso.
ostergaard
27
Alguna evidencia (sólida) del 'propietario' de Redis (según el Código de Google) de que "... las bases de datos no serán desaprobadas incluso si en el pasado dije que lo serían".
Kenny Evitt
3
No podrá utilizar más de un redis db en redis-cluster. Aparte de eso, múltiples bases de datos seguirán siendo una cosa.
coredump
26
-1 para la declaración en desuso. Se pueden desalentar varias bases de datos y no se admiten en el redis-cluster, pero no están en desuso.
AgDude
1
@ the-real-bill ¿Cómo puedes "crear un índice clave"?
Kees de Kooter
57

Incluso Salvatore Sanfilippo (creador de Redis) cree que es una mala idea usar múltiples bases de datos en Redis. Vea su comentario aquí:

https://groups.google.com/d/topic/redis-db/vS5wX8X4Cjg/discussion

Entiendo cómo esto puede ser útil, pero desafortunadamente considero que los errores de múltiples bases de datos de Redis son mi peor decisión en el diseño de Redis ... sin ningún tipo de ganancia real, hace que las partes internas sean mucho más complejas. La realidad es que las bases de datos no se escalan bien por varias razones, como la caducidad activa de claves y VM. Si la selección de la base de datos se puede realizar con una cadena, puedo ver que esta característica se usa como una capa de diccionario O (1) escalable, eso no lo es.

Con los números de base de datos, con un valor predeterminado de algunas bases de datos, creo que estamos comunicando mejor qué es esta característica y cómo se puede usar. Espero que en algún momento podamos abandonar la compatibilidad con múltiples bases de datos, pero creo que probablemente sea demasiado tarde ya que hay varias personas que confían en esta función para su trabajo.

Nirmal
fuente
44
Espera, ¿entonces usar la selección de DB es en realidad menos eficiente que solo usar un prefijo? ¿Es eso lo que significa esta oración aquí (alguien podría aclarar)? "Si la selección de la base de datos se puede realizar con una cadena, puedo ver que esta característica se usa como una capa de diccionario O (1) escalable, eso no es así".
dvtan
8
  1. Realmente no conozco ningún beneficio de tener múltiples bases de datos en una sola instancia. Supongo que es útil si varios servicios usan los mismos servidores de bases de datos, por lo que puede evitar colisiones clave.

  2. No recomendaría construir usando el KEYScomando, ya que es O (n) y eso no escala bien. ¿Para qué lo usas y que puedes lograr de otra manera? Quizás redis no sea la mejor opción para usted si la funcionalidad KEYSes vital.

  3. Creo que mencionan los beneficios de un servidor único en sus preguntas frecuentes, pero lo principal es la simplicidad: no tiene que preocuparse por la concurrencia de ninguna manera real. Cada acción es un bloqueo, por lo que no hay dos cosas que puedan alterar la base de datos al mismo tiempo. Lo ideal sería tener una (o más) instancias por núcleo de cada servidor, y usar un algoritmo de hash consistente (o un proxy) para dividir las claves entre ellos. Por supuesto, perderá algunas funciones: las tuberías solo funcionarán para cosas en el mismo servidor, las clases se volverán más difíciles, etc.

Jonatan Hedborg
fuente
En respuesta al 2: uso el comando de teclas solo cuando necesito todas las teclas. Lo uso de la misma manera que uno usaría hgetall. Ambos son O (n). Keys es malo si necesita buscar expresiones regulares en un gran conjunto de claves, pero está perfectamente bien si necesita realizar alguna operación en todas las teclas en alguna base de datos. En respuesta a 3: entiendo los beneficios del subproceso único en una base de datos. No lo entiendo en muchas bases de datos, ya que una acción en una base de datos nunca necesita bloquear una acción en otra base de datos AFAIK.
Eli
3

Estoy usando redis para implementar una lista negra de direcciones de correo electrónico, y tengo diferentes valores TTL para diferentes niveles de listas negras, por lo que tener diferentes bases de datos en la misma instancia me ayuda mucho.

kommradHomer
fuente
1
Ahora nos enfrentamos al mismo problema: queremos definir diferentes políticas de LRU para diferentes partes de nuestros datos. ¿Puedes compartir cómo implementaste esto?
user2717436
@ user2717436 No estoy seguro de si lo que hago está relacionado con el tuyo, pero uso diferentes bases de datos como conjuntos diferentes, siempre configurando el TTL de las teclas cuando las inserto. como si hubiera una lista negra A en redis.get (1), y cada vez que configuro una clave allí, configuro la caducidad en 5000. y hay una lista negra B en redis.get (2) y cada vez que configuro una clave allí, configuro expirar a 10000
kommradHomer
2

Las bases de datos Redis se pueden usar en los raros casos de implementación de una nueva versión de la aplicación, donde la nueva versión requiere trabajar con diferentes entidades.

Shlomi
fuente
1

El uso de múltiples bases de datos en una sola instancia puede ser útil en el siguiente escenario:

Se podrían usar diferentes copias de la misma base de datos para producción, desarrollo o pruebas utilizando datos en tiempo real. Las personas pueden usar la réplica para clonar una instancia de redis para lograr el mismo propósito. Sin embargo, el primer enfoque es más fácil para que los programas en ejecución existentes solo seleccionen la base de datos correcta para cambiar al modo deseado.

yoonghm
fuente
1

Sé que esta pregunta tiene años, pero hay otra razón por la que varias bases de datos pueden ser útiles.

Si utiliza un "redis en la nube" de su proveedor de nube favorito, probablemente tenga un tamaño de memoria mínimo y pagará lo que asigne. Sin embargo, si su conjunto de datos es más pequeño que eso, estará desperdiciando un poco de la asignación y, por lo tanto, desperdiciando un poco de dinero.

Al usar bases de datos, podría usar la misma instancia de Redis en la nube para proporcionar servicio para (por ejemplo) desarrollo, UAT y producción, o múltiples instancias de su aplicación, o cualquier otra cosa, por lo tanto, usar más de la memoria asignada y ser un poco más costoso. eficaz.

Un caso de uso que estoy viendo tiene varias instancias de una aplicación que usa 200-300K cada una, pero la asignación mínima en mi proveedor de la nube es de 1M. Podemos consolidar 10 instancias en un solo Redis sin realmente hacer mella en ningún límite, y así ahorrar alrededor del 90% del costo de alojamiento de Redis. Aprecio que haya limitaciones y problemas con este enfoque, pero pensé que vale la pena mencionarlo.

Ralph Bolton
fuente