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>
/// 根據Key讀取快取物件
/// </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)容易忽略空值判斷
var model = Get<User>("key");
// 參考型別不存在時model=null,直接存取model.Name會發生空參考錯誤
if(model != null)
{
}Code language: C# (cs)
- 編碼統一
存入、讀取必須統一使用Encoding.UTF8,否則出現亂碼。
讀取值