Breve introducción a Redis
Redis es un motor de base de datos en memoria, basado en el almacenamiento en tablas de hashes (clave/valor) pero que opcionalmente puede ser usada como una base de datos durable o persistente. Está escrito en ANSI C por Salvatore Sanfilippo quien fue patrocinado por VMware y, a partir de 2013, por Pivotal Software.
Está liberado bajo licencia BSD por lo que es considerado software de código abierto.
Al no pertenecer al mundo relacional automáticamente entra en el grupo de bases de datos libres de tipo NoSQL.
Redis no es un almacén plano del clave-valor, él es realmente un servidor de las estructuras de datos, apoyando diversos tipos de valores. Lo que esto significa es que, mientras que en los almacenes de clave-valor tradicionales asoció a las cadenas de claves a cadenas de valores, en Redis el valor no se limita a una cadena simple, sino que también puede contener estructuras de datos más complejas.
Se puede ejecutar operaciones atómicas sobre estos tipos, como agregar elementos a una cadena; incrementar el valor de un hash, integrandolo a una lista; intersección de conjuntos de computación, unión y diferencia, o conseguir el miembro de más alto rango en un conjunto ordenado.
¿Para qué vale Redis?
Redis resuelve de manera sencilla y eficiente problemas que no necesitan la complejidad de las bases de datos relacionales, como lo es en la mayoría de los casos de usos el almacén y gestión de estructuras de datos temporales, por lo cual Redis es mayoritariamente usado para incorporar soluciones sofisticadas de cache de datos ó como backend de operaciones en linea en escenarios de alta demanda. Redis no pierde tiempo pensando en relaciones, restricciones ni tipos de datos, se enfoca en hacer eficientemente su trabajo que es establecer y recuperar (set y get) datos sobre las estructuras con las que cuenta.
Como ejemplos podemos citar:
- Gestión de sesiones de usuarios y soluciones de cache, entre muchas otras.
- incorporar mensajería instantánea en una aplicación, derivas la gestión de chat a Redis y luego resumes la mensajería del dia y la insertas como histórico a tu base de datos principal.
- Suponga que tiene un portal web con mucha trayectoria y miles de millones de contenidos, así como millones de visitas diarias, cuya pagina de inicio abarca el 90% de las visitas de su web, su pagina de inicio solo son 30 contenidos y otros elementos, pues en vez de recorrer su base de datos tradicional con los millones de contenidos en busca de los 30, simplemente los pone a disposición de la manera mas rápida posible.
Modelo de datos
El modelo de datos de Redis se basa en la estructura de datos del tipo diccionario o tabla de hashes que relaciona una llave a un contenido almacenado en un índice. La principal diferencia entre Redis y otros sistemas similares es que los valores no están limitados a ser de tipo string, otros tipos de datos están soportados:
- Listas (Lists) de strings
- Sets de strings (colecciones de elementos desordenados no repetidos)
- hashes donde la llave y el valor son del tipo string
El tipo de valor determina las operaciones (los comandos) que son disponibles. Redis soporta operaciones atómicas de alto nivel del lado del servidor, como inserciones, unions, y diferencias entre sets y listas ordenadas. Desde la versión 2.6, liberada a finales de octubre de 2012, se introduce una funcionalidad clave, la posibilidad de ejecutar Scripts en el servidor Redis, escritos en lenguaje Lua.
La siguiente es la lista de todas las estructuras de datos soportadas por Redis, que se tratarán por separado en este tutorial:
- Cadenas binarias seguras.
- Listas: colecciones de elementos de cadenas ordenadas según el orden de inserción. Son básicamente listas enlazadas.
- Conjuntos: colecciones de elementos de cadena únicos sin clasificar.
- Conjuntos ordenados, similares a Conjuntos pero donde cada elemento de cadena está asociado a un valor numérico flotante, llamado puntuación. Los elementos siempre se toman ordenados por su puntuación, por lo que a diferencia de los conjuntos es posible recuperar un rango de elementos (por ejemplo, puede pedir: darme el top 10 o el 10 inferior).
- Hashes, que son mapas compuestos de campos asociados con valores. Tanto el campo como el valor son cadenas. Esto es muy similar a los hashes de Ruby o Python.
- Arrays de bits (o simplemente mapas de bits): es posible, mediante comandos especiales, manejar valores de cadena como una matriz de bits: puede establecer y borrar bits individuales, contar todos los bits establecidos en 1, encontrar el primer conjunto o bit sin configurar, Etcétera.
- HyperLogLogs: es una estructura de datos probabilística que se utiliza para estimar la cardinalidad de un conjunto. No tengas miedo, es más simple de lo que parece ... Un ejemplo de caso de uso para esta estructura de datos es contar las consultas únicas realizadas por los usuarios en un formulario de búsqueda todos los días.
Persistencia
Redis normalmente guarda la información en la memoria RAM, pero en versiones superiores a la 2.4 se puede configurar para utilizar Memoria virtual pero ahora esto está desactualizado. Se puede hacer que los datos sean persistentes de dos formas:
- Una es hacer snapshots (capturas), aunque no sería realmente durable ya que estos son asíncronos al transferir la memoria al disco cada cierto tiempo.
- Desde la versión 1.1 la mejor alternativa es usar un archivo del tipo appendonly gracias a un sistema de Journaling el cual escribe en este archivo cada modificación que se realice sobre los datos en memoria pudiendo regenerar los datos. Esto genera un costo en el rendimiento, pero se puede configurar de dos formas, always, que escribirá cualquier cambio en el instante, o everysec que lo hará segundo tras segundo.
Replicación
Redis soporta la replicación del tipo maestro-esclavo, pudiéndose replicar los datos de un servidor a muchos esclavos, también un esclavo puede ser maestro para otro esclavo, lo que permite soportar en Redis una replicación en forma de árbol. Los esclavos permiten la escritura de datos, lo que puede ocasionar inconsistencias en los datos no intencionales.
La función de publicación/subscripción esta totalmente soportada, cuando un cliente esclavo se subscribe a un canal este recibe un feed completo de publicaciones del maestro, replicando así en todo el árbol.
La replicación es útil para escalar la lectura (no la escritura) y/o redundar los datos.
Rendimiento
Para escenarios de datos solo usando memoria RAM el rendimiento puede ser extremo, comparado con motores de bases de datos, tampoco hay una notable diferencia entre lectura y escritura de datos, en disco.
Muy buen artículo, estoy pensando en empezar a trabajar con redis y quería ver antes para qué sirve redis. Previamente he usado memcache que supongo que será similar, sobretodo a la hora de cachear información de la Base de Datos, pero nunca había pensando en usarlo como sistema para mensajería instantánea, tiene sentido. La verdad que me sorprendí con los tiempos de diferencia que ofrecen estos sistemas
ResponderEliminar