寫入數值

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>
/// 根據Key讀取快取
/// </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:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *