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.0 en 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:

PoliticaDescripcion
noevictionRetorna errores cuando se alcanza el limite de memoria (predeterminado)
allkeys-lruDesaloja las claves menos usadas recientemente de todas las claves
allkeys-lfuDesaloja las claves menos usadas frecuentemente de todas las claves
volatile-lruDesaloja las claves menos usadas recientemente con expiracion establecida
volatile-lfuDesaloja las claves menos usadas frecuentemente con expiracion establecida
allkeys-randomDesaloja claves aleatorias de todas las claves
volatile-randomDesaloja claves aleatorias con expiracion establecida
volatile-ttlDesaloja 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:

MetricaDescripcion
used_memoryTotal de bytes asignados por Redis
used_memory_humanMemoria usada en formato legible
used_memory_rssResident Set Size (RAM real utilizada)
used_memory_peakPico de uso de memoria
mem_fragmentation_ratioRatio 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

ComandoDescripcion
redis-cli pingProbar la conectividad del servidor
redis-cli INFOMostrar informacion y estadisticas del servidor
redis-cli INFO memoryMostrar detalles de uso de memoria
redis-cli MONITORObservar todos los comandos en tiempo real
redis-cli DBSIZERetornar el numero de claves en la base de datos actual
redis-cli KEYS patternEncontrar claves que coincidan con un patron (usar con precaucion en produccion)
redis-cli SCAN 0 MATCH pattern COUNT 100Escanear claves iterativamente (alternativa segura para produccion a KEYS)
redis-cli SET key value EX secondsEstablecer una clave con expiracion
redis-cli GET keyRecuperar el valor de una clave
redis-cli DEL keyEliminar una o mas claves
redis-cli TTL keyVerificar el tiempo de vida restante de una clave
redis-cli EXPIRE key secondsEstablecer un tiempo de expiracion en una clave
redis-cli FLUSHDBEliminar todas las claves de la base de datos actual
redis-cli SLOWLOG GET 10Ver las 10 consultas lentas mas recientes
redis-cli CLIENT LISTListar todos los clientes conectados
redis-cli CONFIG GET maxmemoryRecuperar un parametro de configuracion
redis-cli CONFIG SET maxmemory 512mbCambiar un parametro de configuracion en tiempo de ejecucion
redis-cli BGSAVEActivar una instantanea RDB en segundo plano
redis-cli BGREWRITEAOFActivar una reescritura de AOF
redis-cli SHUTDOWN SAVEDetener 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 maxmemory y 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, SLOWLOG y redis-cli --bigkeys para detectar problemas temprano
  • Usa SCAN en lugar de KEYS en 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.