> ## 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 e gerenciamento de sessões

# Redis: Caching e gerenciamento de sessões

Em aplicações de alta performance, cada milissegundo conta. O **Redis** atua como uma camada de armazenamento ultrarrápida que vive entre o seu usuário e o seu banco de dados persistente (como PostgreSQL ou MySQL). Neste artigo, exploraremos as duas funções mais vitais do Redis: Caching e Session Management.

---

## 1. O que é Caching e por que usar?

O Cache é o processo de armazenar resultados de operações custosas (como uma query complexa no banco de dados ou o resultado de uma API externa) em um local de acesso rápido.



### Vantagens:
*   **Redução de Latência:** O Redis responde em microssegundos.
*   **Economia de Recursos:** Evita que o seu banco de dados principal processe a mesma informação repetidamente.
*   **Escalabilidade:** Permite que sua aplicação suporte mais usuários simultâneos com o mesmo hardware.

**Exemplo Prático (TTL):**
Uma das funções mais poderosas é o **TTL (Time To Live)**. Você pode salvar um dado e dizer ao Redis: "Apague isso em 600 segundos". Isso garante que o seu cache não fique "velho" para sempre.

---

## 2. Gerenciamento de Sessões

Quando você tem uma aplicação que escala (com múltiplos containers ou shards), você não pode salvar os dados da sessão do usuário (como o carrinho de compras ou o login) na memória local do processo, pois se o usuário cair em outro container, ele perderá tudo.

O Redis resolve isso servindo como uma **fonte centralizada de verdade**:
1. O usuário faz login.
2. Os dados da sessão são salvos no Redis com um ID único.
3. Esse ID é enviado ao usuário via Cookie.
4. Em qualquer requisição futura, qualquer instância da sua aplicação pode consultar o Redis usando esse ID para saber quem é o usuário.

---

## 3. Conectando na Square Cloud

Para conectar sua aplicação ao Redis da Square Cloud, você precisará dos dados fornecidos na aba do seu banco de dados:

*   **Host:** `square-cloud-db-id.squareweb.app` (`id` é o ID da sua instância, já incluso URL copiada).
*   **Porta:** A porta disponibilizada no dashboard.
*   **Senha:** A senha gerada na criação da instância.
*   **Protocolo:** Lembre-se de usar `rediss://` (com dois 's') para conexões seguras com TLS/SSL.

---


## 4. Implementação Técnica

### Em 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');
```

### Em 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. Boas Práticas

*   **Nomenclatura de Chaves:** Use colons (`:`) para organizar nomes, como `app:v1:user:123`. Isso facilita a visualização em ferramentas de gerenciamento.
*   **Evite Chaves Gigantes:** O Redis é rápido, mas ler uma chave de 100MB ainda levará tempo. Tente manter os objetos pequenos.
*   **Monitore a Memória:** O Redis armazena tudo na RAM. Certifique-se de alocar memória suficiente para armazenar os dados sem forçar o limite.