Redis – Tu base de datos libre en memoria

base de datos database memoria ram radis nosql

redisRedis es un motor de base de datos libre de tipo clave-valor (key-value) persistententes que residen en memoria ram y posteriormente vuelca el conjunto de datos almacenados al disco duro. Redis es cliente/servidor por lo que levanta su servicio y responde peticiones, cuenta con interfaz de red lo cual hace posible conectar clientes o nodos desde otros host.

Redis es key/value esto significa que solo entiende Claves y Valores, es decir, cadenas, listas, hash, conjuntos y conjuntos ordenados, de igual manera Redis provee mecanismos para manipular y consultar estas estructuras de datos. Al no pertenecer al mundo relacional automáticamente entra en el grupo de bases de datos libres de tipo NoSQL (Not Only SQL).

Se puede ejecutar operaciones atómicas sobre estos tipos, como agregar elementos a una cadena; incrementar el valor de un hash, empujando 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.

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.

memoria-ram-radis-nosql

memoria-ram-radis-nosql

Ahora bien, todo esto suena excelente, pero ¿para que querría alguien usar esto en la vida real?

  • Su compleja y mimada base de datos relacional que soporta toda la carga de sus operaciones, recientemente se le incorporo mensajería instantánea (si sus usuarios chatean entre si, con clientes y publico en general ) a la aplicación que hace uso de ella, se dio cuenta que esto que no es lo mas importante en su modelo de negocios, le esta colapsando su servicio. Pues transfiera la gestión de chat a Redis y luego totaliza la mensajería del dia y la manda como histórico a su 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.
  • Para análisis y procesamiento en tiempo real. Su país necesita implementar un sistema integral de atención a sus ciudadanos, ideal seria que la carga de consultas de los tickets vigentes resida en una solución como redis, y que el análisis y monitoreo del comportamiento de los usuarios en linea en el sistema también.
  • Gestión de sesiones de usuarios y soluciones de cache, entre muchas otras.

Actualmente Redis es usado por: Twitter, Instagram, GitHub, Flickr, DiggHeroku lo oferta en sus servicios, es soportado por muchos de los proveedores de plataforma como servicio, entre muchos otros de los grandes en internet.

Clientes para Redis

Tiene soporte en todos los lenguajes de programación libres mas conocidos y difundidos como: C, C++, C#, Clojure, Common Lisp, Erlang, Go, Haskell, Java, Lua, Node.js, Objetive-C, Perl, PHP, Python, Ruby, Scala, Scheme, Smalltalk, Tcl, entre otros. La Información oficial sobre los clientes soportados en http://www.redis.io/clients

try-redis

try-redis.io

Se puede probar Redis en linea http://try.redis.io/ mediante su tutorial interactivo donde puedes usar todos los comandos disponibles. El código fuente de la herramienta didáctica también es software libre y disponible en: https://github.com/badboy/try.redis

Comenzando con Redis

En distribuciones de Debian GNU/Linux y derivadas se puede instalar directamente desde sus repositorios con:

root@i5:/home/lenin# aptitude install redis-server

Nota: descargarlo, descomprimirlo y compilarlo así: http://www.redis.io/download

Esto les instalara y dejara funcionando el servidor de base de datos redis. Para bajar, reiniciar o subir el servicio:

# /etc/init.d/redis-server [stop restart start]

Su archivo de configuración de casi 500 lineas muy bien comentado lo encontramos en:

/etc/redis/redis.conf

Redis por defecto escucha por el puerto 6379 y los logs disponibles en:

/var/log/redis/redis-server.log

[7978] 17 Aug 04:28:05 * Server started, Redis version 2.4.14
[7978] 17 Aug 04:28:05 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ‘vm.overcommit_memory = 1’ to /etc/sysctl.conf and then reboot or run the command ‘sysctl vm.overcommit_memory=1’ for this to take effect.
[7978] 17 Aug 04:28:05 * DB loaded from disk: 0 seconds
[7978] 17 Aug 04:28:05 * The server is now ready to accept connections on port 6379
[7978] 17 Aug 04:28:22 # Received SIGTERM, scheduling shutdown…
[7978] 17 Aug 04:28:22 # User requested shutdown…
[7978] 17 Aug 04:28:22 * Saving the final RDB snapshot before exiting.
[7978] 17 Aug 04:28:22 * DB saved on disk
[7978] 17 Aug 04:28:22 * Removing the pid file.
[7978] 17 Aug 04:28:22 # Redis is now ready to exit, bye bye…

Observar como al recibir la señal de bajar el servicio manda a hacer escritura al disco.

Nota: con la ultima linea del log se evidencia que redis tiene sentido del humor.

Las estructuras y sus datos una vez en disco duro se encuentra en formato binario en: /var/lib/redis/dump.rdb

El cliente redis-cli

redis-cli es el cliente por linea de comandos para interactuar con servidores redis. redis-cli tiene semejanza a PSQL, autocompleta si aprietan tab. Con redis-cli -h ven los parámetros que acepta como host, puerto, etc…

root@i5:/home/lenin# redis-cli
redis 127.0.0.1:6379>

Trabajando con cadenas de texto:

redis 127.0.0.1:6379> set textocolaborativo “Esto es una cadena”
OK
redis 127.0.0.1:6379> get textocolaborativo
“Esto es una cadena”
redis 127.0.0.1:6379> append textocolaborativo ” de texto que se esta trabajando ”
(integer) 17
redis 127.0.0.1:6379> append textocolaborativo “de forma colaborativa entre varios usuarios”
(integer) 24
redis 127.0.0.1:6379> get textocolaborativo
“Esto es una cadena de texto que se esta trabajando de forma colaborativa entre varios usuarios”

Trabajando con listas:

redis 127.0.0.1:6379> rpush chat20130817 “Hola lenin como estas?”
(integer) 1
redis 127.0.0.1:6379> rpush chat20130817 “Hola muy bien escribiendo un poco sobre redis”
(integer) 2
redis 127.0.0.1:6379> rpush chat20130817 “Oh que bueno, no hay mucho material en español”
(integer) 3
redis 127.0.0.1:6379> rpush chat20130817 “Asi es, aportando a tubasededatoslibre.org”
(integer) 4
redis 127.0.0.1:6379> lrange chat20130817 0 -1
1) “Hola lenin como estas?”
2) “Hola muy bien escribiendo un poco sobre redis”
3) “Oh que bueno, no hay mucho material en español”
4) “Asi es, aportando a tubasededatoslibre.org”
redis 127.0.0.1:6379> lrange chat20130817 1 2
1) “Hola muy bien escribiendo un poco sobre redis”
2) “Oh que bueno, no hay mucho material en español”

Trabajando con Hashes:

redis 127.0.0.1:6379> hmset enlinea:1 usuario leninmhs nombre “Lenin Hernandez” correo leninmhs@gmail.com twitter @leninmhs
OK
redis 127.0.0.1:6379> hmset enlinea:2 usuario mvalverde nombre “Maria Valverde” correo mvalverde@gmail.com twitter @mvalverde
OK
redis 127.0.0.1:6379> hgetall enlinea:1
1) “usuario”
2) “leninmhs”
3) “nombre”
4) “Lenin Hernandez”
5) “correo”
6) “leninmhs@gmail.com”
7) “twitter”
8) “@leninmhs”
redis 127.0.0.1:6379> hkeys enlinea:2
1) “usuario”
2) “nombre”
3) “correo”
4) “twitter”
redis 127.0.0.1:6379> hmget enlinea:1 usuario nombre
1) “leninmhs”
2) “Lenin Hernandez”

Redis con Perl

Ahora para practicar un poco usaremos perl, el soporte para redis lo tendremos con:

#aptitude install libredis-perl

A continuación desde Perl interactuaremos con la cadena, lista y hash con los que hemos trabajado hasta este punto.

Para ello crearemos el archivo redisperl.pl y agregaremos las siguientes lineas:

#!/usr/bin/perl
# aptitude install libredis-perl

use Redis;
my $redis = Redis->new(server => 'localhost:6379', reconnect => 60, encoding => undef );

#Trabajando con cadenas
print $redis->get('usuariosenlinea')."\n";

#agregando texto a la cadena
print "\nAgregando texto a cadena Redis en Perl: \n";
$redis->append('usuariosenlinea', ' agregado desde perl' );
print "\n".$redis->get('usuariosenlinea')."\n";

#Trabajando con listas
print "\nAccediendo a listas Redis en Perl: \n";
print "$_\n" for $redis->lrange( "chat20130817", 0, -1 );

#Trabajando con hash
print "\n\nUsando HKey en Perl: \n";
print "$_\n" for $redis->hkeys("enlinea:2");

print "\nUsando hmget en Perl: \n";
print "$_\n" for $redis->hmget("enlinea:1", "usuario", "nombre");

#agregando elemento al hash enlinea
@enlinea = (usuario => neo, nombre => "Thomas Anderson", correo => "neo@gmail.com", twitter => neo);
$redis->hmset("enlinea:3", @enlinea );

print "\nUsando hmget de elemento agregado en Perl: \n";
print "$_\n" for $redis->hmget("enlinea:3", "usuario", "nombre");

Salida

lenin@i5:~$ perl redisperl.pl
Esto es una cadena de texto que se esta trabajando de forma colaborativa entre varios usuarios
.
Agregando texto a cadena Redis en Perl:
Esto es una cadena de texto que se esta trabajando de forma colaborativa entre varios usuarios agregado desde perl
.
Accediendo a listas Redis en Perl:
Hola lenin como estas?
Hola muy bien escribiendo un poco sobre redis
Oh que bueno, no hay mucho material en español
Así es, aportando a tubasededatoslibre.org
.
Usando HKey en Perl:
usuario
nombre
correo
twitter
.
Usando hmget en Perl:
leninmhs
Lenin Hernandez
.
Usando hmget de elemento agregado en Perl:
neo
Thomas Anderson
lenin@i5:~$

La referencia oficial del modulo cpan perl para Redis es: http://search.cpan.org/~melo/Redis-1.961/lib/Redis.pm

Mas sobre Redis y Perl:  https://metacpan.org/search?q=redis

Para finalizar

Redis es una alternativa muy interesante, aun queda mucho por hablar tanto en lo conceptual como en su implementación técnica,  es usada sobre todo en aspectos de la arquitectura de software planteada que requiera tiempos de respuesta extremadamente bajos. Los datos que recibirá, procesara o despachara están alojados directamente en la memoria por lo que seguramente sea difícil encontrar soluciones de almacén de datos mas eficientes y rápidos.

redis-joke

redis-joke

Anuncios

7 comentarios en “Redis – Tu base de datos libre en memoria

  1. Las landing page asociadas a un sorteo es una buena opción, una vez que tengan su base de datos les recomiendo usar Marketero que es muy fácil y rápido con el mailing

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s