# 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 es patrocinado por Redis Labs. Es distribuido bajo un modelo de licencias dual: RSALv2 y SSPLv1.

## Historia

El desarrollo de Redis comenzó a principios de 2009 por Salvatore Sanfilippo para mejorar los tiempos de respuesta de un producto llamado LLOGG. El programa fue ganando popularidad, hasta que en marzo del 2010 la empresa VMWare contrató a Salvatore para trabajar a tiempo completo en Redis. Poco después, VMWare contrató también a otro de los principales desarrolladores de Redis, Pieter Noordhuis. Entre mayo de 2013 y julio de 2015 Salvatore Sanfilippo fue patrocinado por Pivotal Software. A partir de esta fecha es patrocinado por Redis Labs.

## Lenguajes soportados

Desde la versión 2.6 el servidor de Redis incorpora un interpretador de Lua.
Los lenguajes de programación que soportan Redis en el cliente son: ActionScript, C, C++, Jeliot,C#, Clojure, Common Lisp, Erlang, Go, Haskell, haXe, Io, Java, server-side JavaScript (Node.js), Lua, Objective-C, Perl, PHP, Pure Data, Python, Ruby, Scala, Smalltalk y Tcl.

## 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
* Conjuntos (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) disponibles. Redis soporta operaciones atómicas de alto nivel del lado del servidor, como inserciones, uniones, y diferencias entre conjuntos y listas ordenadas. Desde la versión 2.6, liberada a finales de octubre de 2012, se introduce la posibilidad de ejecutar Scripts en el servidor Redis, escritos en lenguaje Lua.

## 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 al 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

En escenarios de datos no durables (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.