Visão Geral do Redis e Sistemas NoSQL
O Redis é um sistema de banco de dados NoSQL de alto desempenho, frequentemente utilizado para caching, gerenciamento de sessões e contagem de métricas. Sua arquitetura baseada em chave-valor permite operações em memória com persistência opcional em disco.
Diferenças entre Redis e Memcached
Enquanto o Memcached foca em caching simples de chave-valor, o Redis oferece suporte a múltiplos tipos de dados estruturados e mecanismos de persistência. A tabela abaixo destaca as principais distinções:
| Característica | Redis | Memcached |
|---|---|---|
| Estrutura de Dados | 5 tipos: String, List, Set, Hash, ZSet | Apenas String |
| Persistência | Sim (RDB/AOF) | Não |
| Clusterização | Suportado nativamente | Limitado |
| Cenários de Uso | Caching, filas, contadores, rankings | Caching básico de chave-valor |
Operações com Tipos de Dados no Redis
String (Cadeia de Caracteres)
O tipo String armazena valores simples ou objetos serializados. Ideal para caching e contadores atômicos.
# Definir valor com expiração
SET usuario:456 "Maria Silva" EX 300
# Incrementar contador de visitas
INCR page:home:visits
# Operação atômica de incremento
INCRBY stock:produto_789 10
List (Lista)
Listas implementam filas duplamente encadeadas, úteis para sistemas de mensagens ou histórico.
# Adicionar itens à fila
LPUSH pedidos:fila "order_123" "order_456"
# Consumir com bloqueio
BRPOP pedidos:fila 30
# Manter tamanho limitado
LPUSH noticia:recente "evento_A"
LTRIM noticia:recente 0 49
Set (Conjunto)
Conjuntos armazenam elementos únicos e suportam operações matemáticas como interseção.
# Adicionar tags
SADD artigo:789:tags "python" "fastapi"
# Encontrar interseção
SINTER usuario:101:seguindo usuario:202:seguindo
# Seleção aleatória
SRANDMEMBER sorteio:participantes 3
Hash (Tabela Hash)
Ideais para armazenar objetos complexos com múltiplos campos.
# Atualizar campos específicos
HSET usuario:321:perfil nome "Carlos" nivel 5
# Incrementar campo numérico
HINCRBY usuario:321:stats pontuacao 15
# Recuperar múltiplos campos
HMGET usuario:321:perfil nome email
ZSet (Conjunto Ordenado)
Elementos com pontuação permitindo ordenação eficiente, essencial para rankings.
# Adicionar pontuações
ZADD ranking:semanal 85 "jogador_A" 92 "jogador_B"
# Recuperar top 10
ZREVRANGE ranking:semanal 0 9 WITHSCORES
# Verificar posição
ZRANK ranking:semanal "jogador_A"
Gerenciamento de Chaves
Operações essenciais para administração do espaço de dados:
# Definir tempo de vida
EXPIRE sessao:abc123 3600
# Verificar existência
EXISTS configuracao:sistema
# Escanear chaves de forma segura
SCAN 0 MATCH usuario:* COUNT 50
Bancos de Dados e Transações
O Redis suporta múltiplos bancos de dados isolados e transações com garantias limitadas:
# Selecionar banco de dados
SELECT 2
# Transação básica
MULTI
SET contador:erro 0
INCRBY contador:erro 5
EXEC
# Bloqueio otimista
WATCH inventario:produto_X
MULTI
DECR inventario:produto_X
EXEC
Integração com Spring Boot
Configuração otimizada para uso em aplicações Java:
@Configuration
public class RedisConfig {
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("localhost", 6379);
return new LettuceConnectionFactory(config);
}
}
@Service
public class CacheService {
@Autowired
private StringRedisTemplate redis;
public void saveUser(Long id, String data) {
redis.opsForValue().set("user:" + id, data, 10, TimeUnit.MINUTES);
}
public Long incrementProductView(Long productId) {
return redis.opsForValue().increment("product:" + productId + ":views");
}
}
Padrões de Chaves e Boas Práticas
Utilize uma estrutura hierárquica para organização: tipo:contexto:id:campo
- Exemplo:
user:session:token123 - Evite
KEYS *em produção; prefiraSCANcom filtros - Agrupe operações relacionadas em transações quando necessário