Ler valor

Obter valores no Redis com Get

  1. API de baixo nível:IDatabase.StringGet(key), lê dados do tipo string do Redis e retorna o tipo RedisValue
  2. RedisValue.HasValue:verifica se a chave existe e se contém dados
    • true:a chave existe;
    • false:a chave não existe
  3. Após obter os dados binários, é preciso realizar a desserialização para restaurar o objeto original
  4. 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

  1. Conversão implícita de tipos
    RedisValue suporta conversão implícita direta para byte[], dessa forma você pode passar diretamente rValue para o método Deserialize<T>(byte[]), o compilador faz a conversão automaticamente.
  2. Fluxo pareado de leitura e gravação
Fluxo de gravação SetEntidadeSerializebyte[]Redis
Fluxo de leitura GetRedisbyte[]DeserializeEntidadeCode language: CSS (css)
  1. 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)
  1. Incompatibilidade entre tipos na serialização e desserialização
    Se você salvar um objeto User e tentar ler como Student, ocorrerá um erro de desserialização Json.
  2. 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)
  1. Codificação unificada
    É obrigatório usar sempre Encoding.UTF8 tanto na gravação quanto na leitura, caso contrário surgirão caracteres ilegíveis.

Ler valor

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *