读取值

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,否则乱码。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注