StackExchange.Redis Set/Get genéricos para configuração e leitura
- A chamada interna
IDatabase.StringSet()grava dados do tipo string no Redis - Lógica de serialização: objeto qualquer → string JSON → vetor de bytes UTF‑8 salvo no Redis
- Lógica de desserialização: leitura do vetor de bytes → string JSON → objeto genérico de destino
- Valor de retorno:
true= configuração bem‑sucedida,false= falha na configuração
Namespaces necessários
using StackExchange.Redis;
using Newtonsoft.Json;
using System.Text;Code language: CSS (css)
No exemplo abaixo, usamos Set informando a chave, o vetor de bytes e o tempo de expiração.
/// <summary>
/// Gravar cache no Redis
/// </summary>
/// <param name="key">Chave do cache</param>
/// <param name="data">Qualquer objeto</param>
/// <param name="cacheTime">Tempo de expiração 【minutos】</param>
/// <returns>true sucesso / false falha</returns>
private bool Set(string key, object data, int cacheTime)
{
if (data == null)
{
return false;
}
byte[] entryBytes = Serialize(data);
TimeSpan expiresIn = TimeSpan.FromMinutes(cacheTime);
return db.StringSet(key, entryBytes, expiresIn);
}
/// <summary>
/// Serialização de objeto: object → byte[]
/// </summary>
private byte[] Serialize(object data)
{
string json = JsonConvert.SerializeObject(data);
return Encoding.UTF8.GetBytes(json);
}
/// <summary>
/// Ler cache a partir da chave
/// </summary>
/// <typeparam name="T">Tipo de destino</typeparam>
/// <param name="key">Chave do cache</param>
/// <returns>retorna default(T) caso o cache não exista</returns>
public T Get<T>(string key)
{
RedisValue rValue = db.StringGet(key);
if (!rValue.HasValue)
{
return default(T);
}
T result = Deserialize<T>(rValue);
return result;
}
/// <summary>
/// Desserialização: byte[] → objeto do tipo T
/// </summary>
private T Deserialize<T>(byte[] serializedObject)
{
if (serializedObject == null)
{
return default(T);
}
string json = Encoding.UTF8.GetString(serializedObject);
return JsonConvert.DeserializeObject<T>(json);
}Code language: PHP (php)
Observações
- Unidade de tempo
No códigoTimeSpan.FromMinutes(cacheTime)significa que o valor informado é em 【minutos】
Se você chamar pelo formulário comSet(key,val,1000), o cache vai expirar depois de 1000 minutos, não em segundos!
O código anterior do formulário usava o valor fixo
1000, esse é um ponto de erro muito comum.
Se quiser trabalhar com segundos, substitua porTimeSpan.FromSeconds(cacheTime)
- Instalação das dependências
É preciso instalar os dois pacotes via NuGet:
StackExchange.RedisNewtonsoft.Json
- Formato de armazenamento
Todos os objetos são serializados para binário JSON e salvos no Redis; ao abrir um cliente Redis você visualiza um texto JSON padrão. - Compatibilidade com
RedisValuedb.StringGet(key)retornaRedisValue, ele suporta conversão implícita parabyte[], podendo ser passado diretamente paraDeserialize<T>. - Dica sobre segurança de threads
IConnectionMultiplexerdeve ser um singleton global, não crie uma nova conexão toda vez que ler ou gravar dados no Redis.
Exemplo de uso
// Gravar (expira em 30 minutos)
bool ok = Set("user:1001", new {Id = 1001, Name = "test"}, 30);
// Ler valor
var user = Get<dynamic>("user:1001");
// Exemplo de leitura de classe de entidade
// var model = Get<UserInfo>("user:1001");Code language: JavaScript (javascript)
Recomendações
Extraia esses métodos junto com o código de conexão Redis para uma classe auxiliar estática independente RedisHelper.cs. Evite colocá‑los dentro do código do formulário Form para separar as regras de negócio.
Gravar valor
Previous: Conectar‑se ao Redis