Pular para o conteúdo
Skillpedia
APIs e servidores (backend)280 mil · #115

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

https://github.com/affaan-m/ECC/blob/main/pi/core/skills/redis-patterns/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/pi/core/skills/redis-patterns/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
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-patterns

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/redis-patterns/SKILL.md -o SKILL.md
Conteú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

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas