Redis, desarrollado en 2009, es un motor de base de datos en memoria, basado en el almacenamiento en tablas de hashes (clave/valor), de código abierto, flexible.
Siguiendo los pasos de otras bases de datos NoSQL, como Cassandra, CouchDB y MongoDB, Redis permite al usuario almacenar grandes cantidades de datos sin los límites de una base de datos relacional. Además, también se ha comparado con memcache y se puede usar, con sus elementos básicos como caché con persistencia.
Preparar la instalación
Antes de instalar redis, hay algunos requisitos previos que deben descargarse para que la instalación sea lo más fácil posible.
Comienza por actualizar todos los paquetes apt-get:
1 |
sudo apt-get update |
Una vez que el proceso finalice, descarga un compilador con la construcción esencial que nos ayudará a instalar Redis desde la fuente:
1 |
sudo apt-get install build-essential |
Finalmente, necesitamos descargar tcl:
1 |
sudo apt-get install tcl8.5 |
Instalando redis
Con todos los requisitos previos y dependencias descargados al servidor, podemos continuar y comenzar a instalar redis desde la fuente:
Descarga la última versión estable de tarball de Redis.io.
1 |
wget http://download.redis.io/releases/redis-stable.tar.gz |
Extraer y cambiar a ese directorio:
1 2 |
tar xzf redis-stable.tar.gz cd redis-stable |
Continúa con el comando make:
1 |
make |
Ejecuta la prueba de realización recomendada:
1 |
make test |
Para terminar, ejecuta make install, que instala el programa en todo el sistema.
1 |
sudo make install |
Una vez que el programa ha sido instalado, Redis viene con un script incorporado que configura a Redis para que se ejecute como un demonio en segundo plano.
Para acceder al script muévete al directorio utils:
1 |
cd utils |
Desde allí, ejecuta el script de instalación de Ubuntu/Debian:
1 |
sudo ./install_server.sh |
A medida que se ejecuta el script, puedes elegir las opciones predeterminadas presionando Enter. Una vez que se completa el script, el servidor redis se ejecutará en segundo plano.
Puedes iniciar y detener redis con estos comandos (el número depende del puerto que configuraste durante la instalación. 6379 es la configuración de puerto predeterminada):
1 2 |
sudo service redis_6379 start sudo service redis_6379 stop |
Luego puedes acceder a la base de datos de redis escribiendo el siguiente comando:
1 |
redis-cli |
Ahora tienes Redis instalado y funcionando. El aviso se verá así:
1 |
redis 127.0.0.1:6379> |
Para configurar Redis para que se inicie automáticamente en el arranque, ejecuta:
1 |
sudo update-rc.d redis_6379 defaults |
Asegurando redis
De forma predeterminada, el servidor Redis permite conexiones desde cualquier lugar que sea inseguro. El enlace a localhost restringirá el acceso al servidor en sí mismo y es un buen primer paso para proteger tu servidor.
Abre el archivo de configuración de Redis para editarlo:
1 |
sudo nano /etc/redis/6379.conf |
Localiza esta línea y asegúrate de que no tenga comentarios (elimina el #
si existe):
1 |
bind 127.0.0.1 |
Este es solo un primer paso para proteger tu instancia de Redis.
Operaciones con Redis
Un comando simple para agregar información a una cadena (el tipo de datos redis más básico) podría tener este aspecto:
1 2 |
> SET users:GeorgeWashington "job: President, born:1732, dislikes: cherry trees" OK |
En este caso, al comando SET le sigue la clave (users: GeorgeWashington) y luego el valor (la propia cadena)
Los dos puntos en Redis no tienen ninguna relación con sus operaciones. Sin embargo, pueden ser útiles para describir la clave que se debe completar.
Podemos recuperar los detalles de la nueva cadena con el comando “GET”
1 2 |
GET users:GeorgeWashington "job: President, born:1732, dislikes: cherry trees" |
Rangos:
Al recuperar datos, puedes definir el rango con 2 parámetros: el primer y el último elemento (el primer elemento se considera 0). Si tu parámetro final es -1, se incluirán todos los elementos hasta el final de la lista. Por ejemplo, si una lista contiene los 6 colores del arco iris (organizados con el clásico ROYGBV), podrás ver los siguientes resultados:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
> LRANGE ROYGBV 0 3 1) "red" 2) "orange" 3) "yellow" 4) "green" > LRANGE ROYGBV 0 -1 1) "red" 2) "orange" 3) "yellow" 4) "green" 5) "blue" 6) "violet" > LRANGE ROYGBV 3 -1 1) "green" 2) "blue" 3) "violet" |
Vencimiento:
Si bien Redis es muy útil para almacenar información, también se puede utilizar para caducar los datos sistemáticamente.
El tiempo que debe existir una clave se puede designar en segundos o con una marca de tiempo de Unix (segundos desde el 1/1/1970). Dos comandos útiles que pueden controlar la caducidad son EXPIRE, que establece la cantidad de tiempo que debe existir una clave, y TTL, que muestra el tiempo restante antes de que caduque la clave.
1 2 3 4 5 6 |
> SET classified:information "Secret Stuff" OK > EXPIRE classified:information 45 (integer) 1 > TTL classified:information (integer) 31 |
Intentar recuperar la información después de que haya caducado da como resultado “nil”
1 2 |
> GET classified:information (nil) |
Incrementando:
Redis también tiene la capacidad de incrementar cadenas en su base de datos en una operación atómica. Si se está produciendo un proceso para incrementar un valor, ningún otro comando puede hacerlo al mismo tiempo y los números permanecerán consistentes en toda la base de datos.
1 2 3 4 5 6 |
> SET population 6 OK > INCRBY population 10 (integer) 16 > INCR population (integer) 17 |
Transacciones:
Redis también tiene la capacidad de realizar transacciones, que deben cumplir con dos principios: 1) Los comandos deben ejecutarse en orden. No serán interrumpidos durante el proceso por otras solicitudes. 2) Las transacciones deben ser procesadas en su totalidad.
Las transacciones se inician con el comando MULTI y luego se ejecutan con el comando EXEC.
Si, por algún motivo, hay un problema con el servidor que interrumpe el proceso, la transacción se cerrará y Redis experimentará un error que impide que se reinicie hasta que se ejecute el comando edis-check-aof y la transacción parcial se deshaga y elimine.
Después de eso, el servidor podrá reiniciar.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
> MULTI OK > SET population 6 QUEUED > INCRBY population 10 QUEUED > INCR population QUEUED redis 127.0.0.1:6379> EXEC 1) OK 2) (integer) 16 3) (integer) 1 4) (integer) 17 |
Tipos de datos de redis
Redis tiene cinco tipos de datos: Strings, Sets, Sorted Sets, Lists, Hashes
Strings (cadenas)
Las cadenas son el tipo de datos más básico de Redis.
Algunos comandos comunes asociados con cadenas son:
SET: establece un valor a una clave
GET: obtiene un valor de una clave
DEL: borra una clave y su valor
INCR: incrementa atómicamente una tecla
INCRBY: incrementa una clave en unos valores designados
EXPIRE: la cantidad de tiempo que debe existir una clave (indicada en segundos)
Las cadenas se pueden utilizar para almacenar objetos, ordenados por clave.
Por ejemplo:
1 2 3 4 |
> SET newkey "the redis string begins" OK > GET newkey "the redis string begins" |
Sets (conjuntos)
Si deseas combinar cadenas, puedes hacerlo con conjuntos REDIS, una colección de cadenas desordenadas.
Algunos comandos comunes para Sets son:
SADD: Agregar uno o miembros a un conjunto
SMEMBERS: Obtiene todos los miembros establecidos
SINTER: Encuentra la intersección de conjuntos múltiples.
SISMEMBER: comprueba si un valor está en un conjunto
SRANDMEMBER: Obtiene un miembro de conjunto aleatorio
Los conjuntos pueden ser útiles en una variedad de situaciones. Debido a que cada miembro de un conjunto es único, agregar miembros a un conjunto no requiere una operación de “verificar y luego agregar”. En su lugar, el conjunto verificará si el elemento es un duplicado cada vez que se ejecuta un comando SADD.
1 2 3 4 5 6 7 8 9 10 11 12 |
> SADD colors red (integer) 1 redis 127.0.0.1:6379> SADD colors orange (integer) 1 redis 127.0.0.1:6379> SADD colors yellow (integer) 1 redis 127.0.0.1:6379> SADD colors orange (integer) 0 redis 127.0.0.1:6379> SMEMBERS colors 1) "red" 2) "yellow" 3) "orange" |
Los conjuntos pueden ser especialmente útiles, por ejemplo, para verificar direcciones IP únicas que visitan una página, o para extraer elementos al azar con el comando SRANDMEMBER.
Sorted Sets (Conjuntos ordenados)
Los conjuntos ordenados tienen un nombre intuitivo: son una colección de cadenas asociadas con un número y se organizan de forma predeterminada en orden de menor a mayor.
Este tipo de datos funciona bien con rangos y, debido a que se ordenan desde el principio, los valores de adición, eliminación o actualización se pueden hacer rápidamente.
Algunos comandos comunes para los conjuntos ordenados son:
ZADD: Agrega miembros a un conjunto ordenado
ZRANGE: muestra los miembros de un conjunto ordenado ordenados por índice (con el valor predeterminado de menor a mayor)
ZREVRANGE: muestra los miembros de un conjunto ordenado ordenados por índice (de mayor a menor)
ZREM: elimina miembros de un conjunto ordenado
Podemos crear un conjunto ordenado de muestra con los tamaños (en millas cuadradas) de los países más pequeños del mundo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
> zadd countries 9 Tuvalu (integer) 1 > zadd countries 62 Liechtenstein (integer) 1 > zadd countries .7 Monaco (integer) 1 > zadd countries .2 VaticanCity (integer) 1 > zadd countries 107 Seychelles (integer) 1 redis 127.0.0.1:6379> zrange countries 0 -1 1) "VaticanCity" 2) "Monaco" 3) "Tuvalu" 4) "Liechtenstein" 5) "Seychelles" |
List (Listas)
Las listas en Redis son una colección de valores ordenados. Esto está en contraste con los conjuntos que no están ordenados. Puedes agregar elementos al principio o al final de una lista (incluso cuando hay más de diez millones de elementos en la lista) con gran velocidad.
Algunos comandos comunes asociados con las listas son:
LPUSH: Agregar un valor al principio de una lista
RPUSH: Agregar un valor al final de una lista
LPOP: obtiene y elimina el primer elemento de una lista
RPOP: obtiene y elimina el último elemento de una lista
LREM: Elimina elementos de una lista
RANGO: Obtiene un rango de elementos de una lista
LTRIM: modifica una lista para dejar solo un rango especificado
Podemos crear una lista de personas asignadas para llevar el almuerzo cada semana:
1 2 3 4 5 6 7 8 9 10 |
> rpush lunch.provider alice (integer) 1 > rpush lunch.provider bob (integer) 2 > rpush lunch.provider carol (integer) 3 > rpush lunch.provider don (integer) 4 > rpush lunch.provider emily (integer) 5 |
Si quisiéramos empujar a alguien al frente de la lista, podríamos usar el comando LPUSH:
1 2 |
lpush lunch.provider zoe (integer) 6 |
El comando LRANGE mostraría toda nuestra lista:
1 2 3 4 5 6 7 |
lrange lunch.provider 0 -1 1) "zoe" 2) "alice" 3) "bob" 4) "carol" 5) "don" 6) "emily" |
Las listas a menudo se pueden usar para crear una línea de tiempo de eventos o mantener una colección de un número limitado de elementos.
Hashes
Los hashes en Redis son una herramienta útil para representar objetos con muchos campos. Están configurados para almacenar una gran cantidad de campos en una pequeña cantidad de espacio. Un hash puede almacenar más de 4 mil millones de pares de valor de campo.
Algunos comandos comunes de Hash son:
HMSET: configura múltiples valores hash
HSET: establece el campo hash con un valor de cadena
HGET: recupera el valor de un campo hash
HMGET: recupera todos los valores para campos hash dados
HGETALL: recupera todos los valores de un hash
Podemos usar un hash para describir un usuario de muestra del sitio.
1 2 3 4 5 6 7 8 9 |
> hmset user:1 username jsmith password 4bAc0s email jsmith@gmail.com OK > hgetall user:1 1) "username" 2) "jsmith" 3) "password" 4) "4bAc0s" 5) "email" 6) "jsmith@gmail.com" |
Si necesitas buscar información específica, HMGET muestra los valores solo para los campos solicitados.
1 2 3 |
> hmget user:1 username email 1) "jsmith" "jsmith@gmail.com" |
Conclusión
Desde su lanzamiento, Redis ha ganado rápidamente mucha popularidad, y es aprovechado por github, flickr, Disqus y Craigslist. Además, Redis se puede utilizar con la mayoría de los lenguajes de programación.
Esto solo ha sido una descripción general de algunas de las características básicas de redis. Estaremos encantados de responder preguntas específicas en nuestra sección de comentarios.