Redis
Redis es una base de datos en memoria de código abierto que se utiliza como base de datos, caché y agente de mensajes. Es una base de datos NoSQL que almacena los datos en una estructura de datos clave-valor. Redis es muy rápido y se utiliza a menudo para almacenar datos en caché y sesiones de usuario, pero también se puede utilizar como base de datos principal dependiendo de los requisitos del proyecto.
Características
- Almacenamiento en memoria: Redis almacena los datos en la memoria principal, lo que lo hace muy rápido en comparación con las bases de datos tradicionales que almacenan los datos en el disco.
- Estructura de datos clave-valor: Redis almacena los datos en una estructura de datos clave-valor, lo que lo hace muy eficiente para recuperar y almacenar datos.
- Persistencia opcional: Redis puede ser configurado para almacenar los datos en el disco, lo que proporciona persistencia de los datos en caso de fallo del sistema.
- Replicación y alta disponibilidad: Redis soporta la replicación maestro-esclavo y la partición de datos, lo que proporciona alta disponibilidad y escalabilidad.
- Soporte para estructuras de datos avanzadas: Redis soporta una variedad de estructuras de datos avanzadas como listas, conjuntos, mapas, conjuntos ordenados, etc., lo que lo hace muy versátil y adecuado para una amplia gama de casos de uso.
- Transacciones atómicas: Redis soporta transacciones atómicas, lo que garantiza que las operaciones se realicen de forma segura y consistente.
Instalación
En ubuntu:
Una vez instalado, podemos iniciar el servicio de redis con el siguiente comando:
Para saber en que puerto está corriendo Redis, puedes usar el siguiente comando:
Esto mostrará una lista de puertos abiertos y los programas que los están utilizando. Busca el puerto 6379, que es el puerto predeterminado de Redis.
Interactuando con Redis
Una vez que el servicio de redis está en funcionamiento, podemos interactuar con él a través de la línea de comandos utilizando el cliente de redis. Para abrir el cliente de redis, simplemente escriba redis-cli
en la terminal.
Usos comunes
- Caché de datos: Redis se utiliza a menudo como una capa de caché para almacenar datos en memoria y acelerar las operaciones de lectura/escritura.
- Sesiones de usuario: Redis se utiliza a menudo para almacenar las sesiones de usuario en aplicaciones web para proporcionar una experiencia de usuario rápida y escalable.
- Colas de mensajes: Redis se utiliza a menudo como un agente de mensajes para implementar colas de mensajes y tareas en segundo plano.
- Conteo de visitas: Redis se utiliza a menudo para contar el número de visitas a un sitio web o la cantidad de veces que se ha visto un artículo.
- Almacenamiento de datos en tiempo real: Redis se utiliza a menudo para almacenar datos en tiempo real como puntuaciones de juegos, datos de sensores, etc.
Tipos de datos
- Strings: Almacena cadenas de texto.
- Lists: Almacena listas de elementos.
- Sets: Almacena conjuntos de elementos únicos.
- Hashes: Almacena mapas de campos y valores.
- Sorted Sets: Almacena conjuntos de elementos ordenados por un valor.
Strings
Cadenas de texto básicas. Pueden contener hasta 512 MB de datos.
Tienes los siguientes comandos para trabajar con strings:
SET key value
: Establece el valor de una clave.GET key
: Obtiene el valor de una clave.DEL key
: Elimina una clave.INCR key
: Incrementa el valor de una clave numérica en 1.DECR key
: Decrementa el valor de una clave numérica en 1.APPEND key value
: Añade un valor al final de una cadena.STRLEN key
: Obtiene la longitud de una cadena.MSET key1 value1 key2 value2 ...
: Establece múltiples claves y valores.MGET key1 key2 ...
: Obtiene múltiples valores.EXPIRE key seconds
: Establece un tiempo de expiración en segundos para una clave.TTL key
: Obtiene el tiempo de expiración de una clave en segundos.PERSIST key
: Elimina el tiempo de expiración de una clave.
Lists
Listas de elementos ordenados por índice. Pueden contener hasta 2^32 - 1 elementos (más de 4 mil millones).
Tienes los siguientes comandos para trabajar con listas:
LPUSH key value1 value2 ...
: Añade uno o más elementos al principio de una lista.RPUSH key value1 value2 ...
: Añade uno o más elementos al final de una lista.LPOP key
: Elimina y devuelve el primer elemento de una lista.RPOP key
: Elimina y devuelve el último elemento de una lista.LRANGE key start stop
: Obtiene una lista de elementos en un rango.LINDEX key index
: Obtiene un elemento en un índice específico.LLEN key
: Obtiene la longitud de una lista.LSET key index value
: Establece un elemento en un índice específico.LREM key count value
: Elimina elementos de una lista por valor.LTRIM key start stop
: Recorta una lista a un rango específico.BLPOP key1 key2 ... timeout
: Bloquea y elimina el primer elemento de una lista disponible.BRPOP key1 key2 ... timeout
: Bloquea y elimina el último elemento de una lista disponible.BRPOPLPUSH source destination timeout
: Bloquea y mueve el último elemento de una lista a otra lista.RPOPLPUSH source destination
: Mueve el último elemento de una lista a otra lista.RPUSHX key value
: Añade un elemento al final de una lista si la lista existe.LPUSHX key value
: Añade un elemento al principio de una lista si la lista existe.LINSERT key BEFORE|AFTER pivot value
: Inserta un elemento antes o después de un elemento específico.
LPUSH mylist 1 2 3 4 5 # [5, 4, 3, 2, 1]
LRANGE mylist 0 -1 # [5, 4, 3, 2, 1]
LPOP mylist # 5
RPOP mylist # 1
LLLEN mylist # 3
Sets
Conjuntos de elementos únicos. No se permiten elementos duplicados.
Tienes los siguientes comandos para trabajar con sets:
SADD key member1 member2 ...
: Añade uno o más elementos a un conjunto.SREM key member1 member2 ...
: Elimina uno o más elementos de un conjunto.SMEMBERS key
: Obtiene todos los elementos de un conjunto.SISMEMBER key member
: Comprueba si un elemento está en un conjunto.SCARD key
: Obtiene el número de elementos en un conjunto.SUNION key1 key2 ...
: Obtiene la unión de varios conjuntos.SINTER key key2 ...
: Obtiene la intersección de varios conjuntos.SDIFF key1 key2 ...
: Obtiene la diferencia de varios conjuntos.SPOP key
: Elimina y devuelve un elemento aleatorio de un conjunto.SRANDMEMBER key count
: Obtiene uno o más elementos aleatorios de un conjunto.
SADD myset 1 2 3 4 5 # {1, 2, 3, 4, 5}
SMEMBERS myset # {1, 2, 3, 4, 5}
SREM myset 1 # {2, 3, 4, 5}
SCARD myset # 4
Hashes
Mapas de campos y valores. Cada campo tiene un valor asociado. Son muy similares a los objetos en JavaScript.
Tienes los siguientes comandos para trabajar con hashes:
HSET key field value
: Establece un campo y un valor en un hash.HGET key field
: Obtiene el valor de un campo en un hash.HDEL key field1 field2 ...
: Elimina uno o más campos de un hash.HGETALL key
: Obtiene todos los campos y valores de un hash.HKEYS key
: Obtiene todos los campos de un hash.HVALS key
: Obtiene todos los valores de un hash.
HSET myhash field1 value1 field2 value2 # {field1: value1, field2: value2}
HGET myhash field1 # value1
HDEL myhash field1 # {field2: value2}
Sorted Sets
Conjuntos de elementos ordenados por un valor. Cada elemento tiene un valor asociado que se utiliza para ordenar los elementos.
Tienes los siguientes comandos para trabajar con sorted sets:
ZADD key score1 member1 score2 member2 ...
: Añade uno o más elementos a un conjunto ordenado.ZREM key member1 member2 ...
: Elimina uno o más elementos de un conjunto ordenado.ZRANGE key start stop
: Obtiene una lista de elementos en un rango.ZREVRANGE key start stop
: Obtiene una lista de elementos en un rango en orden inverso.ZSCORE key member
: Obtiene el valor de un elemento en un conjunto ordenado.ZCARD key
: Obtiene el número de elementos en un conjunto ordenado.ZCOUNT key min max
: Obtiene el número de elementos en un rango.ZRANK key member
: Obtiene el rango de un elemento en un conjunto ordenado.ZREVRANK key member
: Obtiene el rango de un elemento en un conjunto ordenado en orden inverso.ZINCRBY key increment member
: Incrementa el valor de un elemento en un conjunto ordenado.
ZADD myzset 1 one 2 two 3 three # {one: 1, two: 2, three: 3}
ZRANGE myzset 0 -1 # [one, two, three]
ZSCORE myzset one # 1
ZREM myzset one # {two: 2, three: 3}
Persistencia
Redis puede ser configurado para almacenar los datos en el disco para proporcionar persistencia de los datos en caso de fallo del sistema. Hay dos formas de persistencia en Redis:
- RDB (Redis Database Backup): Realiza copias de seguridad de los datos en un archivo de volcado en disco en intervalos regulares. Es más rápido y eficiente que AOF, pero puede perder datos en caso de fallo del sistema.
- AOF (Append Only File): Guarda todas las operaciones de escritura en un archivo de registro en disco. Es más lento y menos eficiente que RDB, pero garantiza que no se pierdan datos en caso de fallo del sistema.
- Híbrido: Se puede configurar Redis para utilizar tanto RDB como AOF para proporcionar una combinación de rendimiento y persistencia.
Interaccion con Express
Redis puede usarse junto con Express para almacenar datos en caché y sesiones de usuario. Aquí hay un ejemplo de cómo usar Redis con Express:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient();
app.get('/data', (req, res) => {
client.get('data', (err, data) => {
if (data) {
res.send(data);
} else {
const newData = 'Hello, World!';
client.set('data', newData);
res.send(newData);
}
});
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
En este ejemplo, estamos creando un servidor Express que almacena y recupera datos de Redis. Cuando se accede a la ruta /data
, el servidor comprueba si los datos están en Redis. Si los datos están presentes, los devuelve. Si no, los almacena en Redis y luego los devuelve.