写入值

StackExchange.Redis 通用Set/Get 设置和读取

  1. 底层调用 IDatabase.StringSet() 写入Redis字符串类型数据
  2. 序列化逻辑:任意对象 → JSON字符串 → UTF8 Byte数组存入Redis
  3. 反序列化逻辑:读取Byte数组 → JSON字符串 → 目标泛型对象
  4. 返回值: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)

注意

  1. 时间单位
    代码中 TimeSpan.FromMinutes(cacheTime) = 传入数字代表【分钟】
    如果你窗体调用时传入 Set(key,val,1000),会设置缓存 1000分钟过期,不是秒!

之前窗体代码调用写了1000,这里是典型易错点。
如果想要传入,改成 TimeSpan.FromSeconds(cacheTime)

  1. 依赖安装
    NuGet必须同时安装:
  • StackExchange.Redis
  • Newtonsoft.Json
  1. 数据存储格式
    所有对象都会序列化为JSON二进制存入Redis;打开Redis客户端看到的值是标准JSON文本。
  2. RedisValue 兼容
    db.StringGet(key) 返回 RedisValue,它可以直接隐式转为byte[],所以可以直接传给Deserialize<T>
  3. 线程安全建议
    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里面,实现业务解耦。

Previous:
Next:

发表回复

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