redis-patterns
Ajuda seu agente a usar Redis para guardar dados e acelerar aplicativos. Ele gerencia cache, bloqueios e envios de mensagens.
O que ela faz
Este guia ajuda você a usar o Redis, um banco de dados rápido, para tarefas comuns em programação. Ele mostra como armazenar dados de forma eficiente para acelerar seus aplicativos, controlar o acesso e enviar mensagens.
Quando usar
- ✓Quando você quer que seu aplicativo seja mais rápido usando cache.
- ✓Para limitar quantas vezes um usuário pode fazer algo em um certo tempo.
- ✓Para garantir que apenas uma parte do seu código execute por vez.
Exemplo do que pedir para a IA
“Como posso usar o Redis para armazenar informações de sessão de usuário de forma segura?”
Quer saber mais? Abra as seções abaixo.
Como usar
O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.
Link da skill
Mensagem pronta para colar
Como funciona
Ele usa estruturas de dados do Redis, como strings e hashes, para guardar informações. Para tarefas mais complexas, ele pode usar scripts especiais ou transações para garantir que tudo aconteça corretamente.
Instalação
Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.
No terminal (Claude Code, Codex, Cursor), na pasta do projeto:
npx skills add affaan-m/ECC --skill redis-patternsOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/redis-patterns/SKILL.md -o SKILL.mdConteúdo técnico (SKILL.md)
Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.
Padrões do Redis
Referência rápida para as melhores práticas do Redis em casos de uso comuns de backend.
Como Funciona
O Redis é um armazenamento de estruturas de dados em memória que suporta strings, hashes, listas, sets, sorted sets, streams e mais. Comandos individuais do Redis são atômicos em uma única instância; fluxos de trabalho de várias etapas exigem scripts Lua, transações MULTI/EXEC ou sincronização explícita para permanecerem atômicos. Os dados são opcionalmente persistidos via snapshots RDB ou logs AOF. Clientes se comunicam via TCP usando o protocolo RESP; pools de conexão são essenciais para evitar a sobrecarga de handshake por solicitação.
Quando Ativar
- Adicionando cache a um aplicativo
- Implementando limitação de taxa (rate limiting) ou throttling
- Construindo locks distribuídos ou coordenação
- Configurando armazenamento de sessão ou token
- Usando Pub/Sub ou Redis Streams para mensagens
- Configurando o Redis em produção (pooling, eviction, clustering)
Tabela de Referência de Estruturas de Dados
| Caso de Uso | Estrutura | Chave de Exemplo |
|---|---|---|
| Cache simples | String | product:123 |
| Sessão de usuário | Hash | session:abc |
| Ranking (Leaderboard) | Sorted Set | scores:weekly |
| Visitantes únicos | Set | visitors:2024-01-01 |
| Feed de atividades | List | feed:user:456 |
| Stream de eventos | Stream | events:orders |
| Contadores / Limites de taxa | String (INCR) | ratelimit:user:123 |
| Filtro de Bloom / HLL | HyperLogLog | hll:pageviews |
Padrões Principais
Cache-Aside (Carregamento Preguiçoso)
import redis
import json
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
def get_product(product_id: int):
cache_key = f"product:{product_id}"
cached = r.get(cache_key)
if cached:
return json.loads(cached)
product = db.query("SELECT * FROM products WHERE id = %s", product_id)
r.setex(cache_key, 3600, json.dumps(product)) # TTL: 1 hour
return product
Cache Write-Through
def update_product(product_id: int, data: dict):
# Write to DB first
db.execute("UPDATE products SET ... WHERE id = %s", product_id)
# Immediately update cache
cache_key = f"product:{product_id}"
r.setex(cache_key, 3600, json.dumps(data))
Invalidação de Cache
# Tag-based invalidation — group related keys under a set
def cache_product(product_id: int, category_id: int, data: dict):
key = f"product:{product_id}"
tag = f"tag:category:{category_id}"
pipe = r.pipeline(transaction=True)
pipe.setex(key, 3600, json.dumps(data))
pipe.sadd(tag, key)
pipe.expire(tag, 3600)
pipe.execute()
def invalidate_category(category_id: int):
tag = f"tag:category:{category_id}"
keys = r.smembers(tag)
if keys:
r.delete(*keys)
r.delete(tag)
Armazenamento de Sessão
import time
import uuid
def create_session(user_id: int, ttl: int = 86400) -> str:
session_id = str(uuid.uuid4())
key = f"session:{session_id}"
pipe = r.pipeline(transaction=True)
pipe.hset(key, mapping={
"user_id": user_id,
"created_at": int(time.time()),
})
pipe.expire(key, ttl)
pipe.execute()
return session_id
def get_session(session_id: str) -> dict | None:
data = r.hgetall(f"session:{session_id}")
return data if data else None
def delete_session(session_id: str):
r.delete(f"session:{session_id}")
Limitação de Taxa (Rate Limiting)
Janela Fixa (Simples)
def is_rate_limited(user_id: int, limit: int = 100, window: int = 60) -> bool:
key = f"ratelimit:{user_id}:{int(time.time()) // window}"
pipe = r.pipeline(transaction=True)
pipe.incr(key)
pipe.expire(key, window)
count, _ = pipe.execute()
return count > limit
Janela Deslizante (Lua — Atômico)
-- sliding_window.lua
local key = KEYS[1]
local now = tonumber(ARGV[1])
local window = tonumber(ARGV[2])
local limit = tonumber(ARGV[3])
redis.call('ZREMRANGEBYSCORE', key, 0, now - window)
local count = redis.call('ZCARD', key)
if count < limit then
-- Use unique member (now + sequence) to avoid collisions within the same millisecond
local seq_key = key .. ':seq'
local seq = redis.call('INCR', seq_key)
redis.call('EXPIRE', seq_key, math.ceil(window / 1000))
redis.call('ZADD', key, now, now .. '-' .. seq)
redis.call('EXPIRE', key, math.ceil(window / 1000))
return 1
end
return 0
sliding_window = r.register_script(open('sliding_window.lua').read())
def allow_request(user_id: int) -> bool:
key = f"ratelimit:sliding:{user_id}"
…
Perguntas frequentes
O que é Redis?
Redis é um banco de dados que guarda informações na memória do computador para ser muito rápido. Ele suporta vários tipos de dados, como textos, listas e conjuntos.
Por que usar 'connection pools'?
Criar uma nova conexão com o Redis toda vez que o aplicativo precisa pode ser lento. 'Connection pools' mantêm conexões prontas para uso, economizando tempo.
O que são 'distributed locks'?
São como sinais para garantir que apenas um aplicativo ou processo possa acessar um recurso compartilhado por vez, evitando conflitos.
Detalhes
Descrição original do autor
Redis data structure patterns, caching strategies, distributed locks, rate limiting, pub/sub, and connection management for production applications. Use when adding caching, a distributed lock, rate limiting, or pub/sub with Redis, or when key design needs review.
repo: affaan-m/ECC
Popularidade
- Estrelas no GitHub
- 280 mil
- Posição no ranking
- #115
- Licença
- MIT
- Atualizada em
- 15/10/2026
Comentários
- …
Mais skills deste repositório
accessibility
Ajuda seu agente a criar interfaces que todos possam usar. Garante que sites e aplicativos funcionem bem para pessoas com deficiência, como cegos ou com mobilidade reduzida.
affaan-m/ECC
agent-architecture-audit
Faz seu agente verificar se tudo está funcionando corretamente. Ele encontra e conserta problemas em sistemas de IA, garantindo que funcionem como esperado.
affaan-m/ECC
agent-eval
Ajuda seu agente a comparar diferentes ferramentas de programação de IA. Ele mede qual é mais rápido, barato e confiável para realizar tarefas específicas.
affaan-m/ECC
agent-harness-construction
Faz seu agente entender melhor como realizar tarefas. Ele otimiza as ferramentas e instruções que o agente usa para aumentar suas chances de sucesso.
affaan-m/ECC
Skills parecidas
api-and-interface-design
Ajuda a criar APIs e interfaces bem definidas. É útil ao projetar como diferentes partes de um software vão se comunicar.
addyosmani/agent-skills
mason
Ajuda seu agente a escrever código limpo e funcional. Ele segue as regras definidas para garantir que tudo funcione como esperado.
sickn33/agentic-awesome-skills
max
Faz seu agente melhorar o código existente sem mudar o que ele faz. Ele deixa o código mais fácil de ler e manter.
sickn33/agentic-awesome-skills