¿Redis conserva los datos?


122

Entiendo que Redis sirve todos los datos de la memoria, pero también persiste durante el reinicio del servidor para que cuando el servidor se reinicie lea en la memoria todos los datos del disco. ¿O es siempre una tienda en blanco que solo almacena datos mientras las aplicaciones se ejecutan sin persistencia?


1
No estoy seguro de haber entendido correctamente su pregunta. Puede guardar la instantánea en el disco y leer desde ese archivo, si no lo hace, su base de datos de redis estará vacía cuando reinicie.
Sefa

Respuestas:


82

Le sugiero que lea sobre esto en http://redis.io/topics/persistence . Básicamente, pierde la persistencia garantizada cuando aumenta el rendimiento utilizando solo el almacenamiento en memoria. Imagine un escenario en el que INSERTAR en la memoria, pero antes de que persista, el disco pierde energía. Habrá pérdida de datos.

Redis admite las llamadas "instantáneas". Esto significa que hará una copia completa de lo que hay en la memoria en algunos momentos (por ejemplo, cada hora completa). Cuando pierde energía entre dos instantáneas, perderá los datos del tiempo entre la última instantánea y el bloqueo (no tiene por qué ser un corte de energía ...). Redis negocia la seguridad de los datos con el rendimiento, como hacen la mayoría de las bases de datos NoSQL.

La mayoría de las bases de datos NoSQL siguen un concepto de replicación entre múltiples nodos para minimizar este riesgo. Redis se considera más un caché rápido que una base de datos que garantiza la coherencia de los datos. Por lo tanto, sus casos de uso suelen diferir de los de las bases de datos reales: puede, por ejemplo, almacenar sesiones, contadores de rendimiento o lo que sea con un rendimiento inigualable y sin pérdida real en caso de un bloqueo. Pero procesar pedidos / historiales de compra, etc., se considera un trabajo para las bases de datos tradicionales.


1
Sería fantástico si pudiera agregar el comportamiento de persistencia predeterminado. Como la respuesta de @Leonid Beschastny.
yeya

40

El servidor Redis guarda todos sus datos en el disco duro de vez en cuando, lo que proporciona cierto nivel de persistencia.

Guarda datos en uno de los siguientes casos:

  • automáticamente de vez en cuando
  • cuando llamas manualmente al BGSAVEcomando
  • cuando redis se está apagando

Pero los datos en redis no son realmente persistentes, porque:

  • El bloqueo del proceso de redis significa perder todos los cambios desde la última vez que se guardó
  • BGSAVE la operación solo se puede realizar si tiene suficiente RAM libre (la cantidad de RAM adicional es igual al tamaño de redis DB)

NB: El BGSAVE requisito de RAM es un problema real, porque redis continúa funcionando hasta que no hay más RAM para ejecutar, pero deja de guardar datos en el disco duro mucho antes (aproximadamente al 50% de la RAM).

Para obtener más información, consulte Persistencia de Redis .


1
Desde que se escribió esta respuesta, redis introdujo un modelo de persistencia alternativo llamado AOF que proporciona una persistencia significativamente mayor, pero tiene algunas otras desventajas, como una mayor utilización del disco y un inicio más lento del servidor.
Leonid Beschastny

15

Es cuestión de configuración. Puede tener ninguna persistencia, parcial o total de sus datos en Redis. La mejor decisión será impulsada por las necesidades técnicas y comerciales del proyecto.

De acuerdo con la documentación de Redis sobre persistencia , puede configurar su instancia para guardar datos en el disco de vez en cuando o en cada consulta, en pocas palabras. Proporcionan dos estrategias / métodos AOF y RDB (lea la documentación para ver detalles), puede usar cada uno solo o juntos.

Si desea una "persistencia similar a SQL", han dicho:

La indicación general es que debe usar ambos métodos de persistencia si desea un grado de seguridad de datos comparable a lo que PostgreSQL puede proporcionarle.


7

La respuesta es generalmente , sin embargo, una respuesta más completa realmente depende del tipo de datos que esté tratando de almacenar. En general, la respuesta corta más completa es:

  • Redis no es la mejor opción para el almacenamiento persistente, ya que se centra principalmente en el rendimiento.
  • Redis es realmente más adecuado para el almacenamiento / caché en memoria confiable de los datos del estado actual , en particular para permitir la escalabilidad al proporcionar una fuente central para los datos utilizados en múltiples clientes / servidores.

Habiendo dicho esto, por defecto Redis será persistir datos instantáneas a intervalos periódicos (al parecer esto es cada 1 minuto, pero no he verificado esto - esto es descrito por el artículo siguiente, que es una buena introducción básica):

http://qnimate.com/redis-permanent-storage/


TL; DR

De los documentos oficiales :

  • La persistencia RDB [la opción predeterminada] realiza instantáneas de un momento determinado de su conjunto de datos a intervalos específicos.
  • La persistencia AOF [debe configurarse explícitamente] registra cada operación de escritura recibida por el servidor, que se reproducirá nuevamente al inicio del servidor, reconstruyendo el conjunto de datos original.

Redis debe configurarse explícitamente para la persistencia AOF, si es necesario, y esto dará como resultado una penalización del rendimiento y un aumento de los registros. Puede ser suficiente para una persistencia relativamente confiable de una cantidad limitada de flujo de datos.


5

Puede elegir no tener persistencia en absoluto. Mejor rendimiento, pero todos los datos se pierden cuando Redis se apaga.

Redis tiene dos mecanismos de persistencia: RDB y AOF.RDB usa un programador de instantáneas globales y AOF escribe actualizaciones en un archivo de registro de solo apéndice similar a MySql.

Puede usar uno de ellos o ambos. Cuando Redis se reinicia, construye datos a partir de la lectura del archivo RDB o el archivo AOF.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.