Redis 値の取得 Get
- 下位API:
IDatabase.StringGet(key)、Redisから文字列型データを読み取り、戻り値はRedisValue RedisValue.HasValue:keyの存在有無とデータの有無を判定true:keyが存在する;false:keyが存在しない
- バイナリデータ取得後、逆シリアル化を実行し元のオブジェクトに復元する
- 存在しない場合
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)
注意点
- 型の暗黙の変換
RedisValueはbyte[]へ暗黙変換可能、そのままrValueをDeserialize<T>(byte[])に渡せばコンパイラが自動変換します。 - 読み書き一連の流れ
Set書き込み流れ:エンティティ → Serialize → byte[] → Redis
Get読み取り流れ:Redis → byte[] → Deserialize → エンティティCode language: CSS (css)
- 呼び出しサンプル
// サンプル1:カスタムエンティティ読み込み
var user = Get<User>("user_1001");
// サンプル2:単純文字列読み込み
string text = Get<string>("msg");
// サンプル3:数値読み込み
int count = Get<int>("visit_count");Code language: C# (cs)
- シリアル化・逆シリアル化の型不一致
保存時にUser、読み出し時にStudentを指定するとJSON逆シリアル化例外が発生します。 - default(T)によるnull判定の見落とし
var model = Get<User>("key");
// 参照型が存在しない場合model=null、model.Nameを直接参照するとnull参照例外
if(model != null)
{
}Code language: C# (cs)
- エンコーディング統一
書き込み・読み出しは必ずEncoding.UTF8を統一利用、さもないと文字化けします。
値の取得