StackExchange.Redis 汎用Set/Get 書き込み・読み出し
- 内部で
IDatabase.StringSet()を呼び出し、Redis文字列型データを書き込みます - シリアライズ処理:任意オブジェクト → JSON文字列 → UTF8バイト配列をRedisへ保存
- デシリアライズ処理:バイト配列読み取り → JSON文字列 → ジェネリック型オブジェクトへ復元
- 戻り値:
true= 設定成功、false= 設定失敗
インポートする名前空間
using StackExchange.Redis;
using Newtonsoft.Json;
using System.Text;Code language: CSS (css)
下記サンプルではSetメソッドにキー、バイト配列、有効期限を渡します。
/// <summary>
/// Redisキャッシュへ書き込み
/// </summary>
/// <param name="key">キャッシュキー</param>
/// <param name="data">任意のオブジェクト</param>
/// <param name="cacheTime">有効期限【分】</param>
/// <returns>true成功 / false失敗</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>
/// オブジェクトシリアライズ:object → byte[]
/// </summary>
private byte[] Serialize(object data)
{
string json = JsonConvert.SerializeObject(data);
return Encoding.UTF8.GetBytes(json);
}
/// <summary>
/// キーを指定してキャッシュを読み込む
/// </summary>
/// <typeparam name="T">復元先の型</typeparam>
/// <param name="key">キャッシュキー</param>
/// <returns>キーが存在しない場合は default(T)</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>
/// デシリアライズ:byte[] → 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)
注意点
- 時間単位
コード内TimeSpan.FromMinutes(cacheTime)は引数の単位が【分】です
フォームからSet(key,val,1000)と呼び出すと1000分後に期限切れ、秒ではありません!
前回のフォームサンプルでは
1000を直接指定しており、よくあるミスポイントです。
秒を使いたい場合はTimeSpan.FromSeconds(cacheTime)に変更してください
- 依存パッケージのインストール
NuGetで下記二つをインストールしてください:
StackExchange.RedisNewtonsoft.Json
- データ保存形式
オブジェクトはJSONバイナリに変換しRedisに保存され、Redisクライアント上では標準JSONテキストとして見えます。 RedisValue互換性db.StringGet(key)はRedisValueを返し、暗黙的にbyte[]に変換可能、そのままDeserialize<T>へ渡せます。- スレッドセーフに関する助言
IConnectionMultiplexerはグローバルシングルトンとして扱い、Redis読み書きのたびに接続を新規作成しないでください。
利用例
// 書き込み(30分で期限切れ)
bool ok = Set("user:1001", new {Id = 1001, Name = "test"}, 30);
// 読み込み
var user = Get<dynamic>("user:1001");
// モデルクラス読み込み例
// var model = Get<UserInfo>("user:1001");Code language: JavaScript (javascript)
推奨事項
Redis接続処理とこれらのメソッドをまとめ、独立した静的ヘルパークラス RedisHelper.cs に切り出し、Formコードから分離して責務を分けましょう。
値を書き込む
Previous: Redisへ接続