Redis es un almacen de estructuras de datos en memoria de codigo abierto que funciona como base de datos, cache, agente de mensajes y motor de streaming. Su capacidad para servir datos directamente desde la RAM lo hace extraordinariamente rapido, con tiempos de respuesta tipicos inferiores a un milisegundo. Esta guia te lleva a traves del despliegue de Redis en Ubuntu Server, configurandolo para cargas de trabajo de produccion, asegurandolo contra amenazas comunes y monitoreando su rendimiento con herramientas integradas.
Requisitos Previos
Antes de comenzar, asegurate de tener:
- Ubuntu Server 20.04, 22.04 o 24.04
- Acceso a terminal con privilegios sudo
- Al menos 1 GB de RAM disponible (mas para conjuntos de datos de produccion)
- Familiaridad basica con la linea de comandos de Linux
- Un firewall configurado para restringir acceso (consulta nuestra guia de UFW)
Que Es Redis?
Redis significa Remote Dictionary Server (Servidor de Diccionario Remoto). Creado por Salvatore Sanfilippo en 2009, se ha convertido en uno de los almacenes de datos en memoria mas utilizados en el mundo. A diferencia de las bases de datos tradicionales que leen y escriben en disco, Redis mantiene todo el conjunto de datos en memoria, lo que le permite entregar latencia inferior a un milisegundo tanto para operaciones de lectura como de escritura.
Caracteristicas clave de Redis:
- Almacenamiento en memoria — todos los datos residen en RAM para maxima velocidad
- Estructuras de datos ricas — soporta cadenas, hashes, listas, conjuntos, conjuntos ordenados, streams y mas
- Persistencia opcional — puede escribir datos en disco para durabilidad
- Replicacion — soporta arquitectura maestro-replica para alta disponibilidad
- Operaciones atomicas — todos los comandos se ejecutan atomicamente
- Mensajeria Pub/Sub — sistema de publicacion/suscripcion integrado para comunicacion en tiempo real
- Scripting Lua — ejecuta scripts del lado del servidor para operaciones complejas
Casos de Uso de Redis
Redis sobresale en escenarios donde la velocidad es critica:
Capa de cache: Coloca Redis entre tu aplicacion y la base de datos principal para servir datos frecuentemente solicitados desde memoria. Esto reduce la carga de la base de datos y mejora los tiempos de respuesta dramaticamente.
Almacenamiento de sesiones: Almacena sesiones de usuario en Redis en lugar de almacenes basados en disco. Esto permite compartir sesiones entre multiples servidores de aplicacion y proporciona acceso rapido de lectura/escritura.
Colas de mensajes: Usa listas o streams de Redis como colas de mensajes ligeras para procesamiento asincrono de tareas. Los trabajadores pueden consumir mensajes de forma confiable usando pops bloqueantes o grupos de consumidores.
Mensajeria Pub/Sub: Transmite eventos en tiempo real a multiples suscriptores. Comun para aplicaciones de chat, notificaciones en vivo y dashboards en tiempo real.
Limitacion de tasa: Implementa limitacion de tasa de API usando contadores de Redis con expiracion automatica. Las caracteristicas de incremento atomico y TTL hacen esto sencillo.
Tablas de clasificacion y rankings: Los conjuntos ordenados proporcionan soporte natural para datos clasificados con insercion y recuperacion O(log N) por puntuacion.
Instalacion de Redis en Ubuntu
El enfoque recomendado es instalar Redis desde el repositorio APT oficial para obtener la ultima version estable.
Agregar el Repositorio Oficial de Redis
sudo apt update
sudo apt install -y lsb-release curl gpg
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt update
Instalar Redis
sudo apt install -y redis-server
Verificar la Instalacion
redis-cli ping
Deberias recibir:
PONG
Verifica la version instalada:
redis-server --version
Verifica el estado del servicio:
sudo systemctl status redis-server
Habilita Redis para que inicie con el arranque:
sudo systemctl enable redis-server
Conceptos Basicos de Configuracion
El archivo principal de configuracion de Redis se encuentra en /etc/redis/redis.conf. Antes de hacer cambios, crea una copia de respaldo:
sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.backup
Abre el archivo de configuracion:
sudo nano /etc/redis/redis.conf
Enlace de Red
Por defecto, Redis se enlaza a 127.0.0.1 (solo localhost). Para una capa de cache accedida por aplicaciones locales, esta es la configuracion mas segura:
bind 127.0.0.1 ::1
Si clientes remotos necesitan acceso, agrega la IP privada del servidor:
bind 127.0.0.1 192.168.1.100
Advertencia: Nunca enlaces Redis a
0.0.0.0en un servidor de cara al publico sin autenticacion adecuada y reglas de firewall. Las instancias de Redis expuestas son un objetivo frecuente para ataques automatizados.
Configuracion de Puerto
El puerto predeterminado es 6379. Cambialo si deseas reducir el escaneo automatizado:
port 6379
Memoria Maxima
Establece un limite de memoria duro para evitar que Redis consuma toda la RAM del sistema:
maxmemory 256mb
Ajusta este valor basandote en la memoria disponible de tu servidor. Una regla comun es no asignar mas del 75% de la RAM total a Redis si es la carga de trabajo principal en el servidor.
Politicas de Desalojo
Cuando Redis alcanza el limite de maxmemory, usa una politica de desalojo para decidir que claves eliminar. Configura la politica con:
maxmemory-policy allkeys-lru
Politicas de desalojo disponibles:
| Politica | Descripcion |
|---|---|
noeviction | Retorna errores cuando se alcanza el limite de memoria (predeterminado) |
allkeys-lru | Desaloja las claves menos usadas recientemente de todas las claves |
allkeys-lfu | Desaloja las claves menos usadas frecuentemente de todas las claves |
volatile-lru | Desaloja las claves menos usadas recientemente con expiracion establecida |
volatile-lfu | Desaloja las claves menos usadas frecuentemente con expiracion establecida |
allkeys-random | Desaloja claves aleatorias de todas las claves |
volatile-random | Desaloja claves aleatorias con expiracion establecida |
volatile-ttl | Desaloja claves con el tiempo de expiracion mas cercano |
Para un cache de proposito general, allkeys-lru es la opcion mas comun. Para cargas de trabajo donde la frecuencia de acceso importa mas que la recencia, usa allkeys-lfu.
Despues de modificar la configuracion, reinicia Redis:
sudo systemctl restart redis-server
Opciones de Persistencia
Redis proporciona dos mecanismos para persistir datos en disco.
Instantaneas RDB
RDB crea instantaneas puntuales en intervalos configurados. Esto esta habilitado por defecto:
save 3600 1 300 100 60 10000
Esto significa:
- Guardar si al menos 1 clave cambio en 3600 segundos (1 hora)
- Guardar si al menos 100 claves cambiaron en 300 segundos (5 minutos)
- Guardar si al menos 10000 claves cambiaron en 60 segundos (1 minuto)
El archivo de instantanea se almacena en:
dbfilename dump.rdb
dir /var/lib/redis
Ventajas de RDB:
- Representacion compacta de un solo archivo de tus datos
- Perfecto para respaldos y recuperacion ante desastres
- Impacto minimo en el rendimiento durante operaciones normales
- Reinicios mas rapidos comparado con AOF
Desventajas de RDB:
- Perdida de datos entre instantaneas (hasta varios minutos)
- La operacion de fork puede ser lenta en conjuntos de datos grandes
AOF (Append Only File)
AOF registra cada operacion de escritura para mejor durabilidad:
appendonly yes
appendfilename "appendonly.aof"
Configura la politica de sincronizacion:
# appendfsync always # Sincronizar despues de cada escritura (mas seguro, mas lento)
appendfsync everysec # Sincronizar una vez por segundo (recomendado)
# appendfsync no # Dejar que el SO maneje la sincronizacion (mas rapido, menos seguro)
Ventajas de AOF:
- Mejor durabilidad (como maximo 1 segundo de perdida de datos con
everysec) - El formato solo-agregar es resistente a la corrupcion
- Se reescribe automaticamente para compactar el registro
Desventajas de AOF:
- Mayor tamano de archivo comparado con RDB
- Reinicios mas lentos para conjuntos de datos grandes
Usando Ambos
Para maxima seguridad de datos, habilita tanto RDB como AOF:
save 3600 1 300 100 60 10000
appendonly yes
appendfsync everysec
Cuando ambos estan habilitados, Redis usa el archivo AOF para restaurar datos al inicio ya que tipicamente esta mas completo.
Refuerzo de Seguridad
Una instancia de Redis sin seguridad es un riesgo significativo. Aplica las siguientes medidas para despliegues de produccion.
Establecer una Contrasena
Configura la autenticacion con una contrasena fuerte:
requirepass tu-contrasena-muy-fuerte-aqui
Los clientes deben autenticarse antes de ejecutar comandos:
redis-cli
AUTH tu-contrasena-muy-fuerte-aqui
O conecta con la contrasena en linea:
redis-cli -a tu-contrasena-muy-fuerte-aqui
Renombrar Comandos Peligrosos
Deshabilita o renombra comandos que podrian causar dano:
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
rename-command CONFIG "ADMIN_CONFIG_b4f8e2a1"
Establecer un comando a una cadena vacia "" lo deshabilita completamente. Renombrarlo a una cadena aleatoria larga lo hace accesible solo para administradores que conocen el nuevo nombre.
Restringir Acceso de Red
Siempre enlaza Redis a interfaces especificas y usa un firewall:
bind 127.0.0.1 192.168.1.100
protected-mode yes
Agrega una regla UFW para restringir el acceso a Redis:
sudo ufw allow from 192.168.1.0/24 to any port 6379
Habilitar TLS (Redis 6+)
Para conexiones cifradas, configura TLS:
tls-port 6380
port 0
tls-cert-file /etc/redis/tls/redis.crt
tls-key-file /etc/redis/tls/redis.key
tls-ca-cert-file /etc/redis/tls/ca.crt
Genera certificados para pruebas:
sudo mkdir -p /etc/redis/tls
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/redis/tls/redis.key \
-out /etc/redis/tls/redis.crt \
-subj "/CN=redis-server"
sudo cp /etc/redis/tls/redis.crt /etc/redis/tls/ca.crt
sudo chown redis:redis /etc/redis/tls/*
Conecta con TLS:
redis-cli --tls --cert /etc/redis/tls/redis.crt --key /etc/redis/tls/redis.key --cacert /etc/redis/tls/ca.crt -p 6380
Deshabilitar el Usuario Predeterminado (ACLs de Redis 6+)
Redis 6 introdujo Listas de Control de Acceso para permisos detallados:
redis-cli
ACL SETUSER admin on >contrasena-fuerte ~* +@all
ACL SETUSER default off
Esto crea un usuario admin con acceso completo y deshabilita el usuario predeterminado.
Tipos de Datos y Operaciones
Redis soporta varias estructuras de datos, cada una optimizada para casos de uso especificos.
Cadenas
El tipo mas basico. Almacena texto, numeros o datos serializados:
SET user:1:name "Alice"
GET user:1:name
# "Alice"
SET counter 100
INCR counter
# 101
SET session:abc123 "session_data" EX 3600
# Expira en 3600 segundos
Hashes
Almacena objetos como pares campo-valor:
HSET user:1 name "Alice" email "alice@example.com" age 30
HGET user:1 name
# "Alice"
HGETALL user:1
# 1) "name"
# 2) "Alice"
# 3) "email"
# 4) "alice@example.com"
# 5) "age"
# 6) "30"
Listas
Colecciones ordenadas (listas enlazadas) ideales para colas:
LPUSH tasks "send_email"
LPUSH tasks "process_payment"
RPOP tasks
# "send_email"
LRANGE tasks 0 -1
# 1) "process_payment"
Conjuntos
Colecciones desordenadas de elementos unicos:
SADD tags:post:1 "redis" "caching" "nosql"
SMEMBERS tags:post:1
# 1) "redis"
# 2) "caching"
# 3) "nosql"
SISMEMBER tags:post:1 "redis"
# 1
Conjuntos Ordenados
Conjuntos ordenados por una puntuacion, perfectos para tablas de clasificacion:
ZADD leaderboard 100 "player1" 250 "player2" 175 "player3"
ZREVRANGE leaderboard 0 -1 WITHSCORES
# 1) "player2"
# 2) "250"
# 3) "player3"
# 4) "175"
# 5) "player1"
# 6) "100"
ZRANK leaderboard "player3"
# 1
Gestion de Memoria y Politicas de Desalojo
La gestion efectiva de memoria es critica para el rendimiento y estabilidad de Redis.
Monitoreo del Uso de Memoria
redis-cli INFO memory
Metricas clave a observar:
| Metrica | Descripcion |
|---|---|
used_memory | Total de bytes asignados por Redis |
used_memory_human | Memoria usada en formato legible |
used_memory_rss | Resident Set Size (RAM real utilizada) |
used_memory_peak | Pico de uso de memoria |
mem_fragmentation_ratio | Ratio de RSS a used_memory |
Un mem_fragmentation_ratio significativamente superior a 1.5 indica fragmentacion de memoria. Valores inferiores a 1.0 significan que Redis esta usando swap en disco, lo que degrada severamente el rendimiento.
Reducir el Uso de Memoria
Usa nombres de clave mas cortos donde sea practico:
# En lugar de
SET user:session:authentication:token:abc123 "data"
# Usa
SET u:s:t:abc123 "data"
Establece TTL en claves de cache para asegurar que los datos obsoletos se eliminen:
SET cache:product:42 "product_data" EX 300
Usa hashes para objetos pequenos — Redis optimiza hashes pequenos con codificacion ziplist:
HSET user:1 name "Alice" email "alice@example.com"
Habilita la liberacion diferida para evitar bloqueos durante eliminaciones de claves grandes:
lazyfree-lazy-eviction yes
lazyfree-lazy-expire yes
lazyfree-lazy-server-del yes
Desfragmentacion de Memoria (Redis 4+)
Habilita la desfragmentacion activa para recuperar memoria fragmentada:
activedefrag yes
active-defrag-ignore-bytes 100mb
active-defrag-threshold-lower 10
active-defrag-threshold-upper 100
Monitoreo con redis-cli y el Comando INFO
Redis proporciona varias herramientas integradas para monitoreo.
El Comando INFO
El comando INFO retorna informacion completa del servidor:
redis-cli INFO
Solicita secciones especificas:
redis-cli INFO server
redis-cli INFO memory
redis-cli INFO stats
redis-cli INFO replication
redis-cli INFO clients
redis-cli INFO keyspace
Monitoreo en Tiempo Real
Observa todos los comandos procesados por Redis en tiempo real:
redis-cli MONITOR
Precaucion: El comando MONITOR introduce sobrecarga y no debe dejarse ejecutando en produccion. Usalo solo para sesiones de depuracion.
Registro de Consultas Lentas
Identifica comandos que exceden un tiempo de ejecucion especificado:
redis-cli SLOWLOG GET 10
Configura el umbral del registro lento (en microsegundos):
slowlog-log-slower-than 10000
slowlog-max-len 128
Esto registra cualquier comando que tome mas de 10 milisegundos.
Conexiones de Clientes
Lista todos los clientes conectados:
redis-cli CLIENT LIST
Verifica el numero total de conexiones:
redis-cli INFO clients
Metricas clave de clientes:
connected_clients:15
blocked_clients:0
maxclients:10000
Monitoreo de Latencia
Habilita el monitoreo de latencia y midelo:
redis-cli CONFIG SET latency-monitor-threshold 100
redis-cli LATENCY LATEST
redis-cli LATENCY HISTORY event-name
Redis como Almacen de Sesiones
Redis es una excelente opcion para almacenar sesiones de aplicacion, permitiendo compartir sesiones entre multiples servidores.
Ejemplo con Node.js y Express
const express = require('express');
const session = require('express-session');
const RedisStore = require('connect-redis').default;
const { createClient } = require('redis');
const redisClient = createClient({
url: 'redis://127.0.0.1:6379',
password: 'your-redis-password'
});
redisClient.connect();
const app = express();
app.use(session({
store: new RedisStore({ client: redisClient }),
secret: 'your-session-secret',
resave: false,
saveUninitialized: false,
cookie: {
secure: true,
httpOnly: true,
maxAge: 1800000 // 30 minutes
}
}));
app.get('/', (req, res) => {
req.session.views = (req.session.views || 0) + 1;
res.send(`Views: ${req.session.views}`);
});
app.listen(3000, () => console.log('Server running on port 3000'));
Ejemplo con Python y Flask
from flask import Flask, session
from flask_session import Session
import redis
app = Flask(__name__)
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = redis.Redis(
host='127.0.0.1',
port=6379,
password='your-redis-password'
)
app.config['SESSION_PERMANENT'] = True
app.config['PERMANENT_SESSION_LIFETIME'] = 1800 # 30 minutes
Session(app)
@app.route('/')
def index():
session['views'] = session.get('views', 0) + 1
return f"Views: {session['views']}"
if __name__ == '__main__':
app.run()
Referencia de Comandos Esenciales de redis-cli
| Comando | Descripcion |
|---|---|
redis-cli ping | Probar la conectividad del servidor |
redis-cli INFO | Mostrar informacion y estadisticas del servidor |
redis-cli INFO memory | Mostrar detalles de uso de memoria |
redis-cli MONITOR | Observar todos los comandos en tiempo real |
redis-cli DBSIZE | Retornar el numero de claves en la base de datos actual |
redis-cli KEYS pattern | Encontrar claves que coincidan con un patron (usar con precaucion en produccion) |
redis-cli SCAN 0 MATCH pattern COUNT 100 | Escanear claves iterativamente (alternativa segura para produccion a KEYS) |
redis-cli SET key value EX seconds | Establecer una clave con expiracion |
redis-cli GET key | Recuperar el valor de una clave |
redis-cli DEL key | Eliminar una o mas claves |
redis-cli TTL key | Verificar el tiempo de vida restante de una clave |
redis-cli EXPIRE key seconds | Establecer un tiempo de expiracion en una clave |
redis-cli FLUSHDB | Eliminar todas las claves de la base de datos actual |
redis-cli SLOWLOG GET 10 | Ver las 10 consultas lentas mas recientes |
redis-cli CLIENT LIST | Listar todos los clientes conectados |
redis-cli CONFIG GET maxmemory | Recuperar un parametro de configuracion |
redis-cli CONFIG SET maxmemory 512mb | Cambiar un parametro de configuracion en tiempo de ejecucion |
redis-cli BGSAVE | Activar una instantanea RDB en segundo plano |
redis-cli BGREWRITEAOF | Activar una reescritura de AOF |
redis-cli SHUTDOWN SAVE | Detener el servidor y guardar datos en disco |
Solucion de Problemas
Redis No Inicia
Verifica los registros en busca de errores:
sudo journalctl -u redis-server -n 50
sudo cat /var/log/redis/redis-server.log
Causas comunes:
- Error de sintaxis en
redis.conf— valida el archivo de configuracion - Puerto ya en uso — verifica con
sudo ss -tlnp | grep 6379 - Memoria insuficiente — verifica la RAM disponible con
free -h
Alto Uso de Memoria
redis-cli INFO memory
redis-cli MEMORY DOCTOR
Si mem_fragmentation_ratio esta por encima de 1.5:
- Habilita la desfragmentacion activa
- Reinicia Redis para recuperar memoria fragmentada
Si used_memory esta cerca de maxmemory:
- Revisa y ajusta la politica de desalojo
- Establece valores TTL en claves de cache
- Aumenta el limite de
maxmemory
Errores de Conexion Rechazada
Verifica que Redis este escuchando en la interfaz esperada:
sudo ss -tlnp | grep redis
Revisa la directiva bind en redis.conf y asegurate de que tu firewall permita conexiones:
sudo ufw status | grep 6379
Rendimiento Lento
Investiga con el registro lento:
redis-cli SLOWLOG GET 25
Busca claves grandes que puedan estar bloqueando:
redis-cli --bigkeys
Evita usar KEYS * en produccion. Usa SCAN en su lugar:
redis-cli SCAN 0 MATCH "user:*" COUNT 100
Errores de Persistencia
Si las instantaneas RDB fallan:
redis-cli INFO persistence
Busca rdb_last_bgsave_status:err. Soluciones comunes:
- Asegurate de que el directorio de datos de Redis sea escribible:
sudo chown redis:redis /var/lib/redis - Verifica que haya suficiente espacio en disco:
df -h /var/lib/redis - Revisa la configuracion de overcommit:
sudo sysctl vm.overcommit_memory=1
Resumen
Redis es un poderoso almacen de datos en memoria que puede mejorar dramaticamente el rendimiento de tu aplicacion cuando se usa como capa de cache, almacen de sesiones o agente de mensajes. Al configurar correctamente los limites de memoria, politicas de desalojo, persistencia y configuraciones de seguridad, puedes ejecutar Redis de manera confiable en entornos de produccion.
Puntos clave:
- Instala Redis desde el repositorio oficial para obtener la ultima version estable
- Siempre establece
maxmemoryy una politica de desalojo apropiada para prevenir crecimiento descontrolado de memoria - Elige tu estrategia de persistencia basandote en requisitos de durabilidad — RDB para instantaneas periodicas, AOF para durabilidad casi en tiempo real, o ambos
- Refuerza Redis con autenticacion por contrasena, restricciones de enlace de red y comandos peligrosos renombrados
- Monitorea el rendimiento con
INFO,SLOWLOGyredis-cli --bigkeyspara detectar problemas temprano - Usa
SCANen lugar deKEYSen produccion para evitar bloquear el servidor
Para una configuracion integral de seguridad del servidor, consulta nuestras guias sobre Configuracion de Firewall UFW y la Lista de Verificacion de Seguridad para Servidores Linux.