viernes, 4 de enero de 2013

¿Qué es Redis?


Con el auge de Internet, las aplicaciones modernas cada vez tienen que dar servicio a un mayor número de usuarios (imaginaros el número de peticiones por segundo que reciben los servidores de Facebook, Google o Twitter). Las arquitecturas tecnológicas que se utilizaban antiguamente para desarrollar aplicaciones no son suficientemente escalables como para soportar cientos de millones de usuarios, por lo que ha sido necesario re-inventar el concepto de "Arquitectura Tecnológica de Aplicaciones" para dar cabida a estas nuevas necesidades, apoyándose en productos innovadores que sustituyen a las antiguas arquitecturas Cliente-Servidor y las Bases de Datos Relacionales.

En febrero del 2011 estuve en el Spring I/O, y os conté como una de las charlas que me encantó se llamaba “Aplicaciones web ultraescalables con Redis”. Era uno de mis primeros contactos con las base de datos NoSQL (de las que también os hablé hace tiempo). Ha llovido mucho desde entonces, y de todos los nuevos productos con los que he trabajado en este tiempo hay uno que me parece especialmente revolucionario y visionario, REDIS.

¿Qué es Redis?
La mejor definición que se me ocurre de Redis es que se trata de “un servidor de caché de memoria que conoce la estructura de los datos que alberga” o dicho de otra forma, “una caché de datos con estructura”.
La idea de servidores de caché de memoria en los que se alberga información para su rápido acceso desde distintos puntos es muy antigua, y existen productos muy consolidados en el mercado, como el famoso Memcached, utilizado por sitios con muchos millones de usuarios como Wikipedia, Twitter, Youtube, WordPress, etc.
Y si ya existen otros productos servidores de caché de memoria, ¿qué aporta Redis sobre ellos y por qué es tan revolucionario? El factor que diferencia a Redis respecto a una caché de memoria convencional es que conoce la estructura de los datos que alberga. Lo más fácil para entender el concepto es poner un ejemplo:

Imaginad que tenéis una aplicación web y queréis cachear en un servidor aparte (un servidor de memoria) la lista de los usuarios que están activos, para que pueda ser accedida desde diversas máquinas – todas las de un cluster:

  • Si queremos realizar esto con un producto que no sabe de estructuras de datos (como Memcached), cada vez que queremos modificar dicha lista de usuarios – por ejemplo para eliminar uno de ellos que ya no está activo - la tenemos que traer entera a uno de los servidores, modificarla y volverla a escribir entera. Esto es muy ineficiente, sobre todo cuando mayor es la lista. 
  • Para realizar esto con Redis, tenemos funciones de la caché para albergar listas (entre otras estructuras de datos, sabe manejar listas), de forma que sólo tendríamos que indicar a Redis que elimine un determinado elemento de la lista. Más adelante indicaremos los tipos de estructuras de datos que maneja Redis.


Un poco de historia
El desarrollo de Redis fue iniciado por Salvatore Sanfilippo a principios del 2009, para acelerar los tiempos de respuesta de un producto llamado LLOGG. Pronto fue ganando popularidad, hasta que en Marzo del 2012 la empresa VMWare contrató a Salvatore para trabajar a tiempo completo en Redis. Poco después VMWare contrató también a uno de los principales desarrolladores de Redis, Pieter Noordhuis. Desde entonces Redis ha evolucionado muy rápidamente, incluyendo funcionalidades que le hacen tan útil.

Tipos de Estructura de Datos soportados por Redis
Actualmente Redis soporta cinco tipos de estructuras de datos:
  1. Cadenas de caracteres (Strings)
  2. Listas (Lists)
  3. Conjuntos (Sets)
  4. Conjuntos Ordenados (Sorted Sets)
  5. Tablas Hash (Hashes)
Aunque puede parecer una lista muy corta, sólo con estos cinco tipos de estructuras se pueden modelar infinitud de procesos y aplicaciones complejas, hasta el punto que muchos de los usuarios de Redis han terminado por sustituir completamente las bases de datos relacionales.

Otras funcionalidades que aporta
Además de actuar como servidor de estructuras de datos, Redis aporta otras funcionalidades muy interesantes:

  • Expiración de claves basada en tiempo
  • Sistema de Publicación y Subscripción a colas de mensajes
  • Operaciones Atómicas y Transacciones
  • Persistencia periódica de la memoria a disco, para recuperación ante caídas
  • Replicación Maestro-Esclavo, para en el futuro implementar un Cluster
  • Protocolo abierto, y uso desde decenas de lenguajes de programación

Además, con la versión 2.6 de Redis liberada a finales de Octubre de 2012, se introduce una funcionalidad clave, la posibilidad de ejecutar Scripts dentro del servidor Redis, escritos en lenguaje LUA.

Rendimiento y Uso de Redis
Redis está escrito en ANSI C muy optilizado, lo que le hace increíblemente rápido, he visto con mis propios ojos a un sólo servidor de Redis procesar más de 150.000 peticiones por segundo. Este es uno de los motivos por los que se ha hecho tan popular, y es utilizado en multitud de sitios actualmente, algunos tan famosos como Flickr, Stack Overflow, GitHub,  o la española Telefónica Digial.

El futuro de Redis
Desde la liberación de la versión 2.6, el equipo de Redis está bastante centrado en el desarrollo del Cluster de Redis, cuyo trabajo comenzó hace tiempo pero fue delegado a un segundo plano hasta que estuviese listo el Scripting en LUA (el cluster en principio estaba planificado para ser liberado a finales del 2011). Ahora que la versión 2.6 está liberada y estable, parece que hay avances en la implementación del Cluster que se liberará en la versión 3.0.

Algunos Enlaces Interesantes


6 comentarios:

Anónimo dijo...

Muy bueno! Voy a tener que hacer por coincidir contigo en el comedor.

D.M.

Anónimo dijo...
Este comentario ha sido eliminado por un administrador del blog.
Anónimo dijo...

Muchisimas gracias por la entrada, por fin una explicacion clara de lo que es Redis :)

PERCY AMERI dijo...

buen aporte ..bien explicado gracias.

Anónimo dijo...

Buen aporte, saludos

FAUSTO FABIÁN GARCETE dijo...

Buen aporte, gracias por la información