Integração do Redis com .NET
O Redis é um banco de dados em memória de alto desempenho frequentemente utilizado como camada de cache, broker de mensagens e armazenamento de dados em aplicações .NET. A integração aproveita a capacidade de leitura/gravação rápida do Redis para otimizar desempenho e escalabilidade.
Operações Básicas de Chave-Valor
Armazenamento e Recuperação
using StackExchange.Redis;
IDatabase redisDB = ConnectionMultiplexer.Connect("localhost").GetDatabase();
// Armazenar valor
redisDB.StringSet("chave", "dados");
// Recuperar valor
string conteudo = redisDB.StringGet("chave");
Expiração de Chaves
// Definir expiração em 30 segundos
redisDB.KeyExpire("chave", TimeSpan.FromSeconds(30));
Tipos de Dados Estruturados
Conjuntos e Hashes
// Adicionar elemento a conjunto
redisDB.SetAdd("usuarios", "id123");
// Armazenar objeto como hash
redisDB.HashSet("perfil:1", new HashEntry[] {
new("nome", "Ana"),
new("email", "ana@exemplo.com")
});
Classe Auxiliar para Redis
Encapsula operações complexas e gerencia conexões:
public class GerenciadorRedis {
private readonly IDatabase _db;
public GerenciadorRedis(string conexao) {
_db = ConnectionMultiplexer.Connect(conexao).GetDatabase();
}
public void Armazenar(string chave, string valor, TimeSpan? expiracao = null) {
_db.StringSet(chave, valor, expiracao);
}
public string Recuperar(string chave) {
return _db.StringGet(chave);
}
}
ServiceStack com Redis
Simplifica a integração através de clientes gerenciados:
public class ServicoUsuarios : Service {
public IRedisClient ClienteRedis { get; set; }
public object Get(ObterUsuario pedido) {
Usuario usuario = ClienteRedis.Get<Usuario>(pedido.Id)
?? BuscarDoBanco(pedido.Id);
return usuario;
}
}
Otimizações de Desempenoh
- Cache de dados frequentes com expiração
- Serialização eficiente com System.Text.Json
- Operações assíncronas para evitar bloqueios
// Serialização rápida
string json = JsonSerializer.Serialize(objeto);
Usuario instancia = JsonSerializer.Deserialize<Usuario>(json);
// Operação assíncrona
await _db.StringSetAsync("chave", "valor");
Casos de Uso Avançados
Bloqueio Distribuído
public bool ObterBloqueio(string recurso, string identificador, TimeSpan duracao) {
return _db.LockTake(recurso, identificador, duracao);
}
Filas de Mensagens
// Adicionar à fila com expiração
_db.ListRightPush("fila_tarefas", "dados");
_db.KeyExpire("fila_tarefas", TimeSpan.FromMinutes(10));