讀取值

Redis 讀取值 Get

  1. 底層API:IDatabase.StringGet(key),從Redis讀取字串型別資料,回傳型別為 RedisValue
  2. RedisValue.HasValue:判斷該key是否存在、是否有資料
    • true:key存在;
    • false:key不存在
  3. 讀取到二進位資料後,需要反序列化,還原為原始物件
  4. 不存在時回傳 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)

注意事項

  1. 型別隱含轉換
    RedisValue 可以直接隱含轉換成 byte[],程式碼可直接把 rValue 傳入 Deserialize<T>(byte[]),編譯器會自動轉換。
  2. 讀寫配對流程
Set寫入流程:實體 → Serializebyte[]Redis
Get讀取流程:Redisbyte[]Deserialize → 實體Code language: CSS (css)
  1. 呼叫範例
// 範例1:讀取自訂實體
var user = Get<User>("user_1001");

// 範例2:讀取簡單字串
string text = Get<string>("msg");

// 範例3:讀取數字
int count = Get<int>("visit_count");Code language: C# (cs)
  1. 序列化與反序列化型別不一致
    存入時存 User,讀取時用 Student,會觸發Json反序列化錯誤。
  2. default(T)容易忽略空值判斷
var model = Get<User>("key");
// 參考型別不存在時model=null,直接存取model.Name會發生空參考錯誤
if(model != null)
{

}Code language: C# (cs)
  1. 編碼統一
    存入、讀取必須統一使用 Encoding.UTF8,否則出現亂碼。

讀取值

發佈留言

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