Redis e Chave-Valor
Use o Redis para caches, contadores de limite de taxa, pub/sub e estado de sessão efêmero ao lado do seu banco de dados SQL principal.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
use redis::AsyncCommands;
let client = redis::Client::open(redis_url)?;
let mut conn = client.get_multiplexed_async_connection().await?;
let _: () = conn.set_ex("user:1:session", session_id, 3600).await?;
let cached: Option<String> = conn.get("user:1:profile").await?;Quando usar isso: Chaves "quentes" com muitas leituras, expiração baseada em TTL, locks distribuídos ou pub/sub entre instâncias - não como fonte primária de verdade para dinheiro.
Exemplo de Trabalho
use redis::AsyncCommands;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
struct Profile { name: String }
async fn cached_profile(
conn: &mut redis::aio::MultiplexedConnection,
user_id: u64,
loader: impl FnOnce() -> Profile,
) -> redis::RedisResult<Profile> {
let key = format!("profile:{user_id}");
if let Ok(json) = conn.get::<_, String>(&key).await {
if let Ok(p) = serde_json::from_str(&json) {
return Ok(p);
}
}
let profile = loader();
let _: () = conn.set_ex(&key, serde_json::to_string(&profile).unwrap(), 300).await?;
Ok(profile)
}O que isso demonstra:
- Conexão assíncrona multiplexada do crate
redis. - Cache-aside: obtém JSON, em caso de falha carrega e
set_excom TTL. - Serde JSON como convenção de codificação de valor.
- Nomenclatura de chaves com namespaces de dois pontos.
Mergulho Profundo
Como Funciona
- O Redis é em memória com persistência opcional (RDB/AOF).
- Chaves TTL expiram automaticamente - ideal para sessões e caches.
- Servidor single-threaded - evite valores enormes e tempestades de chaves "quentes".
Padrões Comuns
| Padrão | Tipo Redis | Uso |
|---|---|---|
| Cache | String (JSON) | Perfil, configuração |
| Limite de taxa | String INCR | Contadores por IP |
| Lock | String SET NX | Seções críticas curtas |
| Fila | List / Stream | Buffer simples de tarefas |
| Pub/Sub | Canais | Fan-out de invalidação de cache |
Notas de Rust
// fred ou deadpool-redis para pooling de conexão em escalaArmadilhas
- Cache como fonte de verdade - Perda de dados em
flushperde registros financeiros. Correção: SQL autoritativo; apenas cache Redis. - Sem TTL - As chaves crescem até OOM. Correção: Sempre defina TTL nas entradas de cache.
- Thundering herd - Stampede de falha de cache em chave "quente". Correção: Lock de voo único ou stale-while-revalidate.
- Grandes blobs JSON - Bloqueia o thread único do Redis. Correção: Mantenha os valores pequenos; divida ou use SQL para payloads grandes.
- Confiabilidade do Pub/sub - Dispare e esqueça, sem persistência. Correção: Use Redis Streams ou um message broker para tarefas.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Cache moka em processo | Instância única, latência de microssegundos | Consistência entre instâncias necessária |
| Memcached | Apenas cache TTL simples | Pub/sub, estruturas, persistência |
| PostgreSQL UNLOGGED | Equipe pequena, um banco de dados | Camada de cache dedicada já existe |
FAQs
Qual crate Rust?
Crate redis com recursos assíncronos; fred para configurações com muitos clusters.
Pool de conexões?
deadpool-redis ou conexão multiplexada por processo.
Modo Cluster?
Use cliente ciente de cluster; use hash tags para operações multi-chave.
TLS?
URL rediss:// com o recurso rustls no cliente.
Serialização?
JSON para depuração; MessagePack para tamanho em escala.
Invalidar cache?
Canal pub/sub ou sufixo de versão na chave em escritas.
Rate limiting?
INCR com janela EXPIRE - veja a página de Limite de Taxa.
Armazenamento de sessão?
Chave de ID de sessão aleatória com TTL; armazene o ID do usuário como valor.
Testes?
Módulo Redis testcontainers ou mock embutido implementando trait.
Exclusão GDPR?
Rastreie padrões de chaves por usuário; exclua por prefixo SCAN na exclusão da conta.
Relacionados
- Pooling de Conexão - Pools Redis
- Noções Básicas de Bancos de Dados - Divisão SQL + cache
- Limite de Taxa e Prevenção de Abuso - Contadores Redis
- Autenticação e Sessões - Armazenamento de sessão
- Melhores Práticas de Banco de Dados - Disciplina de cache
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4 e Polars 0.46+.