> ## Knowledge Base Index
> Fetch the complete knowledge base index at: https://help.squarecloud.app/sitemap.xml
> Use this file to discover available pages before exploring further.
> Pure-Markdown content can be obtained by appending a '.md' suffix to the content URLs listed in the sitemap (without the trailing slash).

# Redis: caching y gestión de sesiones

# Redis: caching y gestión de sesiones

En aplicaciones de alto rendimiento, cada milisegundo cuenta. **Redis** actúa como una capa de almacenamiento ultrarrápida que vive entre tu usuario y tu base de datos persistente (como PostgreSQL o MySQL). En este artículo, exploraremos las dos funciones más vitales de Redis: Caching y Session Management.

---

## 1. ¿Qué es el caching y por qué usarlo?

El caché es el proceso de almacenar resultados de operaciones costosas (como una query compleja en la base de datos o el resultado de una API externa) en un lugar de acceso rápido.

### Ventajas:
*   **Reducción de latencia:** Redis responde en microsegundos.
*   **Ahorro de recursos:** Evita que tu base de datos principal procese la misma información repetidamente.
*   **Escalabilidad:** Permite que tu aplicación soporte más usuarios simultáneos con el mismo hardware.

**Ejemplo práctico (TTL):**
Una de las funciones más poderosas es el **TTL (Time To Live)**, que define un tiempo de expiración para cada clave, garantizando que tu caché no quede "viejo" para siempre.

---

## 2. Gestión de sesiones

Cuando tienes una aplicación que escala (con múltiples contenedores o shards), no puedes guardar los datos de la sesión del usuario (como el carrito de compras o el login) en la memoria local del proceso, pues si el usuario cae en otro contenedor, lo perderá todo.

Redis resuelve esto sirviendo como una **fuente centralizada de verdad**:
1. El usuario inicia sesión.
2. Los datos de la sesión se guardan en Redis con un ID único.
3. Ese ID se envía al usuario vía Cookie.
4. En cualquier petición futura, cualquier instancia de tu aplicación puede consultar Redis usando ese ID para saber quién es el usuario.

---

## 3. Conectando en Square Cloud

Para conectar tu aplicación al Redis de Square Cloud, necesitarás los datos proporcionados en la pestaña de tu base de datos:

*   **Host:** `square-cloud-db-id.squareweb.app` (`id` es el ID de tu instancia, ya incluido en la URL copiada).
*   **Puerto:** El puerto proporcionado en el dashboard.
*   **Contraseña:** La contraseña generada en la creación de la instancia.
*   **Protocolo:** Recuerda usar `rediss://` (con dos 's') para conexiones seguras con TLS/SSL.

---

## 4. Implementación técnica

### En Node.js (usando `ioredis`)
```javascript
import { createClient } from "redis";
import fs from "fs";

const client = createClient({
  url: "rediss://default:JTI6bNRaws1Z1jokWU8mRfoW@square-cloud-db-{id}.squareweb.app:{port}",
  socket: {
    tls: true,
    ca: fs.readFileSync("ca-certificate.crt")
  },
});

// Salvando no cache por 1 hora (3600 segundos)
await redis.set('usuario:123:perfil', JSON.stringify(perfil), 'EX', 3600);

// Recuperando do cache
const cache = await redis.get('usuario:123:perfil');
```

### En Python (usando `redis-py`)
```python
import redis
import os
import ssl
from pathlib import Path

ca_cert_path = Path(__file__).with_name("ca-certificate.crt")
r = redis.from_url(
    "rediss://default:JTI6bNRaws1Z1jokWU8mRfoW@square-cloud-db-{id}.squareweb.app:{port}",
    decode_responses=True,
    ssl_cert_reqs=ssl.CERT_REQUIRED,
    ssl_ca_certs=str(ca_cert_path)
)

# Definindo uma sessão com expiração
r.setex("sessao:token_abc", 1800, "usuario_id_45")

# Buscando a sessão
user_id = r.get("sessao:token_abc")
```

---

## 5. Buenas prácticas

*   **Nomenclatura de claves:** Usa dos puntos (`:`) para organizar los nombres, como `app:v1:user:123`. Esto facilita la visualización en herramientas de gestión.
*   **Evita claves gigantes:** Redis es rápido, pero leer una clave de 100MB aún llevará tiempo. Intenta mantener los objetos pequeños.
*   **Monitorea la memoria:** Redis almacena todo en la RAM. Asegúrate de asignar memoria suficiente para almacenar los datos sin forzar el límite.