Implementação do Redis em Aplicações .NET

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));

Tags: Redis .NET C# ServiceStack cache

Publicado em 7-9 07:03