Obter valores no Redis com Get
- API de baixo nível:
IDatabase.StringGet(key), lê dados do tipo string do Redis e retorna o tipoRedisValue RedisValue.HasValue:verifica se a chave existe e se contém dadostrue:a chave existe;false:a chave não existe
- Após obter os dados binários, é preciso realizar a desserialização para restaurar o objeto original
- Retorna
default(T)quando a chave não existe- Tipos de valor(int/DateTime):retorna 0 e o horário mínimo
- Tipos de referência(class):retorna null
Exemplos
using StackExchange.Redis;
using Newtonsoft.Json;
using System.Text;
/// <summary>
/// Lê um objeto em cache através da chave
/// </summary>
/// <typeparam name="T">Tipo do objeto de destino</typeparam>
/// <param name="key">Nome da chave de cache</param>
/// <returns>Retorna o objeto se existir; retorna default(T) caso não exista</returns>
public T Get<T>(string key)
{
// Lê os dados do redis
RedisValue rValue = db.StringGet(key);
// Verifica se a chave não existe
if (!rValue.HasValue)
{
return default(T);
}
// Desserializa os dados binários para entidade
T result = Deserialize<T>(rValue);
return result;
}
/// <summary>
/// Desserialização:byte[] → objeto T
/// </summary>
private T Deserialize<T>(byte[] serializedObject)
{
if (serializedObject == null)
{
return default(T);
}
// Converte o array de bytes para string json
string json = Encoding.UTF8.GetString(serializedObject);
// Converte json para a entidade de destino
return JsonConvert.DeserializeObject<T>(json);
}
/// <summary>
/// Método de serialização de objeto (utilizado em conjunto com o Set)
/// </summary>
private byte[] Serialize(object data)
{
string json = JsonConvert.SerializeObject(data);
return Encoding.UTF8.GetBytes(json);
}Code language: C# (cs)
Observações
- Conversão implícita de tipos
RedisValuesuporta conversão implícita direta para byte[], dessa forma você pode passar diretamenterValuepara o métodoDeserialize<T>(byte[]), o compilador faz a conversão automaticamente. - Fluxo pareado de leitura e gravação
Fluxo de gravação Set:Entidade → Serialize → byte[] → Redis
Fluxo de leitura Get:Redis → byte[] → Deserialize → EntidadeCode language: CSS (css)
- Exemplo de chamada
// Exemplo1: Ler entidade personalizada
var user = Get<User>("user_1001");
// Exemplo2: Ler string simples
string text = Get<string>("msg");
// Exemplo3: Ler valor numérico
int count = Get<int>("visit_count");Code language: C# (cs)
- Incompatibilidade entre tipos na serialização e desserialização
Se você salvar um objetoUsere tentar ler comoStudent, ocorrerá um erro de desserialização Json. - Fácil esquecimento da verificação de valor nulo com default(T)
var model = Get<User>("key");
// Quando o tipo de referência não existe, model=null, acessar diretamente model.Name causa erro de referência nula
if(model != null)
{
}Code language: C# (cs)
- Codificação unificada
É obrigatório usar sempreEncoding.UTF8tanto na gravação quanto na leitura, caso contrário surgirão caracteres ilegíveis.
Ler valor
Previous: Gravar valor
Next: Verificar existência