値の取得

Redis 値の取得 Get

  1. 下位API:IDatabase.StringGet(key)、Redisから文字列型データを読み取り、戻り値は RedisValue
  2. RedisValue.HasValue:keyの存在有無とデータの有無を判定
    • true:keyが存在する;
    • false:keyが存在しない
  3. バイナリデータ取得後、逆シリアル化を実行し元のオブジェクトに復元する
  4. 存在しない場合 default(T) を返す
    • 値型(int/DateTime):0、最小日時を返す
    • 参照型(class):nullを返す

サンプルコード

using StackExchange.Redis;
using Newtonsoft.Json;
using System.Text;

/// <summary>
/// キーからキャッシュオブジェクトを読み込む
/// </summary>
/// <typeparam name="T">対象オブジェクト型</typeparam>
/// <param name="key">キャッシュキー名</param>
/// <returns>存在時はオブジェクト、存在しない場合はdefault(T)を返す</returns>
public T Get<T>(string key)
{
    // redisからデータ読み込み
    RedisValue rValue = db.StringGet(key);

    // keyが存在しない判定
    if (!rValue.HasValue)
    {
        return default(T);
    }

    // バイナリデータを逆シリアル化しエンティティへ
    T result = Deserialize<T>(rValue);
    return result;
}

/// <summary>
/// 逆シリアル化:byte[] → Tオブジェクト
/// </summary>
private T Deserialize<T>(byte[] serializedObject)
{
    if (serializedObject == null)
    {
        return default(T);
    }
    // byte配列をJSON文字列へ変換
    string json = Encoding.UTF8.GetString(serializedObject);
    // JSONを対象エンティティへ変換
    return JsonConvert.DeserializeObject<T>(json);
}

/// <summary>
/// オブジェクトシリアル化メソッド(Setとペアで使用)
/// </summary>
private byte[] Serialize(object data)
{
    string json = JsonConvert.SerializeObject(data);
    return Encoding.UTF8.GetBytes(json);
}Code language: C# (cs)

注意点

  1. 型の暗黙の変換
    RedisValuebyte[]へ暗黙変換可能、そのまま rValueDeserialize<T>(byte[]) に渡せばコンパイラが自動変換します。
  2. 読み書き一連の流れ
Set書き込み流れ:エンティティ → Serializebyte[]Redis
Get読み取り流れ:Redisbyte[]Deserialize → エンティティCode language: CSS (css)
  1. 呼び出しサンプル
// サンプル1:カスタムエンティティ読み込み
var user = Get<User>("user_1001");

// サンプル2:単純文字列読み込み
string text = Get<string>("msg");

// サンプル3:数値読み込み
int count = Get<int>("visit_count");Code language: C# (cs)
  1. シリアル化・逆シリアル化の型不一致
    保存時に User、読み出し時に Student を指定するとJSON逆シリアル化例外が発生します。
  2. default(T)によるnull判定の見落とし
var model = Get<User>("key");
// 参照型が存在しない場合model=null、model.Nameを直接参照するとnull参照例外
if(model != null)
{

}Code language: C# (cs)
  1. エンコーディング統一
    書き込み・読み出しは必ず Encoding.UTF8 を統一利用、さもないと文字化けします。

値の取得

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です