値を書き込む

StackExchange.Redis 汎用Set/Get 書き込み・読み出し

  1. 内部で IDatabase.StringSet() を呼び出し、Redis文字列型データを書き込みます
  2. シリアライズ処理:任意オブジェクト → JSON文字列 → UTF8バイト配列をRedisへ保存
  3. デシリアライズ処理:バイト配列読み取り → JSON文字列 → ジェネリック型オブジェクトへ復元
  4. 戻り値: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)

注意点

  1. 時間単位
    コード内 TimeSpan.FromMinutes(cacheTime)引数の単位が【分】です
    フォームから Set(key,val,1000) と呼び出すと1000分後に期限切れ、秒ではありません!

前回のフォームサンプルでは 1000 を直接指定しており、よくあるミスポイントです。
を使いたい場合は TimeSpan.FromSeconds(cacheTime) に変更してください

  1. 依存パッケージのインストール
    NuGetで下記二つをインストールしてください:
  • StackExchange.Redis
  • Newtonsoft.Json
  1. データ保存形式
    オブジェクトはJSONバイナリに変換しRedisに保存され、Redisクライアント上では標準JSONテキストとして見えます。
  2. RedisValue互換性
    db.StringGet(key)RedisValue を返し、暗黙的に byte[] に変換可能、そのまま Deserialize<T>へ渡せます。
  3. スレッドセーフに関する助言
    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:

コメントを残す

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