El sistema de bases de datos Redis ha ido ganando en po­pu­la­ri­dad en los últimos años. Sus pri­n­ci­pa­les atra­c­ti­vos son la velocidad y la sencillez de la es­tru­c­tu­ra de las bases de datos: los datos se in­tro­du­cen di­re­c­ta­me­n­te en la memoria principal del servidor, de manera que se pueden recuperar de forma mucho más rápida que en otras bases de datos. Esto hace que se use a menudo como caché de páginas web, aunque los servicios de me­n­sa­je­ría también la usan para lograr una co­mu­ni­ca­ción más rápida. En nuestro tutorial de Redis, apre­n­de­rás a instalar tu propia base de datos Redis.

Paso 1: instalar Redis

Redis es open source, es decir, de código abierto, así que cua­l­quie­ra puede descargar, usar y editar el sistema.

Nota

A co­n­ti­nua­ción, de­s­cri­bi­re­mos cómo instalar y co­n­fi­gu­rar Redis en Ubuntu, pero también puede hacerse en Mac y en Windows. Si por el momento solo quieres probar Redis sin in­s­ta­lar­lo en tu ordenador, te re­co­me­n­da­mos el entorno de prueba online Try Redis.

El primer paso consiste en descargar Redis. Para ello, usamos el gestor de paquetes de Ubuntu, que tendremos que ac­tua­li­zar primero a la versión más reciente.

sudo apt-get update
sudo apt-get install redis-server

Otra manera de hacerlo es descargar los archivos desde la web oficial de Redis. Siguiendo este camino, sin embargo, hay que extraer los archivos del paquete ma­nua­l­me­n­te, para luego in­s­ta­lar­los y, fi­na­l­me­n­te, iniciar Redis:

redis-server

Para comprobar si Redis funciona co­rre­c­ta­me­n­te, iniciamos la interfaz de co­mu­ni­ca­ción con la base de datos:

redis-cli

La interfaz debería mostrar entonces la dirección IP y el puerto a través del cual se ejecuta Redis, a los que se puede enviar un ping de co­m­pro­ba­ción.

127.0.0.1:6397> ping
PONG

Si Redis responde, queda de­mo­s­tra­do que el sistema de bases de datos se ha instalado co­rre­c­ta­me­n­te. Ahora también se puede comprobar si se puede escribir texto.

127.0.0.1:6397> set test "OK!"
127.0.0.1:6397> get test
"OK!"
Nota

¿Quieres intalar Redis en tu propio servidor? Los se­r­vi­do­res en la nube de IONOS pueden escalarse también para proyectos pequeños.

Paso 2: co­n­fi­gu­rar Redis

Redis se instala, en un principio, con la co­n­fi­gu­ra­ción estándar, que luego puede mo­di­fi­car­se con los comandos co­rre­s­po­n­die­n­tes.

127.0.0.1:6397> config get *

En la lista de ajustes para la co­n­fi­gu­ra­ción, las parejas de elementos se de­s­co­m­po­nen en dos po­si­cio­nes, una debajo de la otra: al elemento db­fi­le­na­me le co­rre­s­po­n­de, entonces, el valor dump.rdb. El asterisco que hemos usado para abrir la lista actúa de marcador de posición para un ajuste de­te­r­mi­na­do de la lista. Cuando solo se quiere examinar un ajuste, el asterisco se reemplaza por el nombre del elemento, uti­li­za­n­do siempre para ello el que se encuentra en primera posición, que es la llave para el valor de co­n­fi­gu­ra­ción co­rre­s­po­n­die­n­te.

127.0.0.1:6397> config get dbfilename
1) "dbfilename"
2) "dump.rdb"

Para cambiar una entrada en el archivo de co­n­fi­gu­ra­ción, se usa el comando set. Puede usarse, por ejemplo, para definir una co­n­tra­se­ña:

127.0.0.1:6397> config set requirepass "password"
OK

Tras hacerlo, si so­li­ci­ta­mos la co­n­tra­se­ña con el comando get, se nos pedirá que la in­tro­du­z­ca­mos nosotros primer, al fin y al cabo, por algo le hemos puesto una. Para in­tro­du­ci­r­la, usamos el comando auth y, a co­n­ti­nua­ción, co­n­su­l­ta­mos la entrada en el archivo de co­n­fi­gu­ra­ción como acabamos de hacer.

127.0.0.1:6397> auth "password"
127.0.0.1:6397> config get requirepass
1) "requirepass"
2) "password"
Nota

Existen más formas de hacer más segura tu base de datos. En la página web oficial de Redis, los de­sa­rro­lla­do­res resumen diversos puntos al respecto.

En realidad, Redis guarda todos los datos en la memoria principal. Teniendo esto en cuenta, para lograr la pe­r­si­s­te­n­cia de los datos, se puede almacenar una copia (snapchot) de la base de datos en el disco duro, que se ubicará en el archivo dump.rdb.

127.0.0.1:6397> save

Con el comando save, se crea ma­nua­l­me­n­te una copia, pero también pueden pro­gra­mar­se para que se realicen de forma au­to­má­ti­ca.

127.0.0.1:6397> save 60 10

En este ejemplo, hemos asignado dos pa­rá­me­tros al comando: ahora, se creará una copia cada 60 segundos si ya se han producido 10 cambios en dicho intervalo de tiempo.

Sin embargo, el comando save no se re­co­mie­n­da mientras el sistema esté en fu­n­cio­na­mie­n­to, ya que impide que los clientes accedan a la base de datos. En estos casos es más co­n­ve­nie­n­te bgsave, que realiza el proceso en un segundo plano.

Además de la po­si­bi­li­dad de hacer una copia de la base de datos, también existen el modo append only file, en el que Redis guarda en un archivo cada acción realizada. Gracias a este archivo, si el servidor se averiara ine­s­pe­ra­da­me­n­te, se podría averiguar qué fue lo último que se hizo. Para activar el modo AOF, debe mo­di­fi­car­se el archivo de co­n­fi­gu­ra­ción.

127.0.0.1:6397> config set appendonly yes
Consejo

Si tus datos requieren la máxima seguridad, deberías activar el modo AOF y, además, hacer copias regulares de la base de datos: así será prá­c­ti­ca­me­n­te imposible que pierdas tus datos. Estos procesos, no obstante, ra­le­n­ti­zan en cierta medida el fu­n­cio­na­mie­n­to de la base de datos.

Paso 3: crear entradas

Una vez hayas co­n­fi­gu­ra­do Redis, ya puedes trabajar con la base de datos. Dispones para ello de varios tipos distintos de datos y de comandos.

Strings

Lo más fácil es crear una string, es decir, una cadena o secuencia de elementos. Para ello, utiliza el comando set.

Nota

No importa si se in­tro­du­cen los valores entre comillas o no. Para hacer el código más legible, puede ponerse el texto entre comillas y los valores numéricos sin ellas.

127.0.0.1:6397> set foo "bar"
127.0.0.1:6397> set value 1

Si se solicitan ahora las entradas foo y value mediante el comando get, se mostrarán los valores co­rre­s­po­n­die­n­tes.

127.0.0.1:6397> get foo
"bar"
127.0.0.1:6397> get value
"1"

El comando para borrar una entrada es del.

127.0.0.1:6397> del foo
(integer) 1
127.0.0.1:6397> get foo
(nil)

Si no quieres crear muchas entradas usando una fila nueva cada vez, puedes usar la función avanzada mset. Para solicitar los valores de varios campos a la vez, también existe el comando mget.

127.0.0.1:6397> mset foo1 "bar1" foo2 "bar2" foo3 "bar3"
OK
127.0.0.1:6397> mget foo1 foo2 foo3
1) "bar1"
2) "bar2"
3) "bar3"

Listas

Con Redis se pueden usar, además, otros tipos de datos. Algunos de los más populares para trabajar con la base de datos son, por ejemplo, las listas y los sets. Ambos son conjuntos de valores, pero, mientras que los sets no tienen un orden concreto, los valores de las listas están numerados. En una lista se pueden añadir, solicitar o borrar entradas.

127.0.0.1:6397> lpush mylist foo
(integer) 1
127.0.0.1:6397> lpush mylist bar
(integer) 2
127.0.0.1:6397> lrange mylist 0 10
1) "foo"
2) "bar"
127.0.0.1:6397> linsert mylist before "bar" "test"
(integer) 3
127.0.0.1:6397> lrange mylist 0 10
1) "foo"
2) "test"
3) "bar"
127.0.0.1:6397> lrem mylist 0 foo
(integer) 1
127.0.0.1:6397> lrange mylist 0 10
1) "test"
2) "bar"

En este ejemplo hemos añadido en primer lugar dos elementos a una lista (lpush) y luego hemos so­li­ci­ta­do que se muestren. Con el comando lrange se indica qué segmento debe mostrarse (aquí del 0 al 10, pero pueden usarse también números negativos). A co­n­ti­nua­ción, mediante el comando linsert hemos añadido un valor nuevo delante de uno que ya existía (también podría usarse after), con lo cual hemos cambiado la nu­me­ra­ción. El comando lrem permite borrar de la lista entradas con un valor es­pe­cí­fi­co.

Sets

Para los sets, Redis utiliza otros comandos, pero con re­su­l­ta­dos muy similares:

127.0.0.1:6397> sadd myset "foo"
(integer) 1
127.0.0.1:6397> sadd myset "bar"
(integer) 1
127.0.0.1:6397> smembers myset
1) "bar"
2) "foo"
127.0.0.1:6397> sismember myset "bar"
(integer) 1
127.0.0.1:6397> srem myset "bar"
(integer) 1
127.0.0.1:6397> smembers myset
1) "foo"

Con el comando sadd también se pueden integrar varios elementos en el set si se in­tro­du­cen en el comando uno detrás de otro. Para vi­sua­li­zar el set, basta con usar el comando smembers y el nombre del set en cuestión. El comando sismember permite, además, buscar una entrada concreta. De manera análoga a la lista, con srem se pueden borrar entradas sueltas.

Sin embargo, Redis también ofrece a los usuarios la po­si­bi­li­dad de utilizar sets en un formato ordenado.

127.0.0.1:6397> zadd mysortedset 1 "foo"
(integer) 1
127.0.0.1:6397> zadd mysortedset 2 "bar"
(integer) 1
127.0.0.1:6397> zadd mysortedset 2 "foobar"
(integer) 1
127.0.0.1:6397> zrange mysortedset 0 10
1) "foo"
2) "bar"
3) "foobar"

Para añadir elementos se utiliza, en este caso, el comando zadd y un score o puntaje. Mientras que los valores pro­pia­me­n­te dichos no pueden aparecer más de una vez, con un score se puede indicar un mismo valor varias veces. El score no es, por lo tanto, una nu­me­ra­ción directa dentro del set, sino una po­n­de­ra­ción, de manera que todas las entradas con el puntaje o score 2 apa­re­ce­rán tras los que tengan el score 1. Con el comando zrange se pueden vi­sua­li­zar todos los elementos o los que se se­le­c­cio­nen.

Hashes

Un tipo especial de datos son los hashes: entradas in­di­vi­dua­les co­m­pue­s­tas de varios valores, de manera similar a los sets y las listas, pero en los que cada valor va aco­m­pa­ña­do de una clave, formando así los llamados pares clave-valor o key-value.

127.0.0.1:6397> hset user1 name "bob" email "bob@example.com" password "rK87_x"
OK
127.0.0.1:6397> hget user1 name
1) "bob"
127.0.0.1:6397> hgetall user1
1) "name"
2) "bob"
3) "email"
4) "bob@example.com"
5) "password"
6) "rK87_x"
127.0.0.1:6397> hvals user1
1) "bob"
2) "bob@example.com"
3) "rK87_x"
127.0.0.1:6397> hkeys user1
1) "name"
2) "email"
3) "password"
> hdel user1 password
(integer) 1
127.0.0.1:6397> hgetall user1
1) "name"
2) "bob"
3) "email"
4) "bob@example.com"
127.0.0.1:6397> del user1
(integer) 1
127.0.0.1:6397> hgetall user1
(empty list or set)

En este ejemplo, hemos usado hset para crear un hash con el nombre user1 y tres campos. Mediante el comando hget podemos solicitar el valor de cada campo. Para que se muestren todos, se puede usar hgetall. Otras opciones para vi­sua­li­zar valores son hvals (muestra todos los valores guardados en el hash) y hkeys (muestra todas las claves guardadas en el hash). Con hdel se pueden borrar valores sueltos, mientras que con del, como ya hemos visto, se borra el hash entero.

Nota

El comando flushall sirve para borrar todas las entradas de la base de datos.

Paso 4: otras opciones

Na­tu­ra­l­me­n­te, con Redis no solo se pueden crear entradas en una base de datos, sino que también pueden asignarse pro­pie­da­des concretas a los datos. En este sentido, pueden resultar muy útiles, por ejemplo, los comandos de in­cre­me­n­to y de­cre­me­n­to.

127.0.0.1:6397> set foo 1
OK
127.0.0.1:6397> get foo
"1"
127.0.0.1:6397> incr foo
(integer) 2
127.0.0.1:6397> incr foo
(integer) 3
127.0.0.1:6397> get foo
"3"
127.0.0.1:6397> decr foo
(integer) 2
127.0.0.1:6397> get foo
"2"

Con la ayuda de estas funciones, se pueden in­cre­me­n­tar o reducir los valores en una unidad. A veces, en cambio, se quieren in­tro­du­cir valores que solo pe­r­ma­ne­z­can en la base de datos durante cierto tiempo: para ello existe la función expire.

127.0.0.1:6397> set foo "bar"
OK
127.0.0.1:6397> expire foo 100
(integer) 1
127.0.0.1:6397> ttl foo
(integer) 50
127.0.0.1:6397> ttl foo
(integer) -50
127.0.0.1:6397> get foo
(nil)

El comando expire requiere una in­di­ca­ción de tiempo en segundos. En este ejemplo, hemos decidido que la entrada debe durar 100 segundos. Una vez tra­n­s­cu­rri­da la mitad del tiempo, hemos usado el comando ttl para solicitar el time-to-live, es decir, el tiempo restante. Si esperamos aún más, el TTL pasará a ser negativo a partir del momento en el que la entrada ya haya des­apa­re­ci­do.

El comando setex permite asignar un TTL a una entrada de la base de datos ya desde su creación.

127.0.0.1:6397> setex foo 100 "bar"
OK

Una vez se ha creado una entrada, esta se puede ampliar: el comando append añade otro valor al que ya existía.

127.0.0.1:6397> set foo "Hello"
OK
127.0.0.1:6397> append foo " World"
(integer) 11
127.0.0.1:6397> get foo
"Hello World"
127.0.0.1:6397> set bar 5
OK
127.0.0.1:6397> append bar 10
(integer) 3
127.0.0.1:6397> get bar
"510"

Como se puede ver, al solicitar los valores co­rre­s­po­n­die­n­tes, aparecen los nuevos elementos si­m­ple­me­n­te tras los que ya estaban. Si la entrada en cuestión aún no existe, append realiza entonces la misma función que set.

Además, también se puede cambiar el nombre de las entradas usando el comando rename.

127.0.0.1:6397> set foo 100
OK
127.0.0.1:6397> rename foo bar
OK
127.0.0.1:6397> get foo
(nil)
127.0.0.1:6397> get bar
"100"
Consejo

Existen muchos otros comandos para trabajar con Redis. En la de­s­cri­p­ción oficial se pueden consultar los detalles de todos los comandos di­s­po­ni­bles.

Ir al menú principal