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