StackExchange.Redis 通用Set/Get 设置和读取
- 底层调用
IDatabase.StringSet()写入Redis字符串类型数据 - 序列化逻辑:任意对象 → JSON字符串 → UTF8 Byte数组存入Redis
- 反序列化逻辑:读取Byte数组 → JSON字符串 → 目标泛型对象
- 返回值:
true= 设置成功,false= 设置失败
需要引入命名空间
using StackExchange.Redis;
using Newtonsoft.Json;
using System.Text;Code language: CSS (css)
下面实例,使用Set,输入key,然后输入字节数组,然后输入过期时间。
/// <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里面,实现业务解耦。