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>
/// 根據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)
注意事項
- 時間單位
程式碼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