如何使用StackExchange.Redis存储用户定义的对象

本文关键字:定义 对象 用户 存储 何使用 StackExchange Redis | 更新日期: 2023-09-27 18:19:36

我在ServiceStack.redis中使用

IRedisTypedClient<ObjectName> myObj = redisClient.As<ObjectName>();

但我在StackExchange.Redis.中找不到任何这样做的例子

我必须序列化为JSON然后存储它们吗?

提前Thanx。

如何使用StackExchange.Redis存储用户定义的对象

目前,SE.RRedis并没有尝试提供串行化——有太多不同的方法可以做到这一点。我认为图书馆应该做一件事,而不是7件。应该可以简单地通过扩展方法或其他管道/包装代码,选择您选择的任何串行化策略和任何库来添加任何混合串行化等问题。

最简单的解决方案是使用json/二进制/其他序列化。更复杂但更自然-使用redis";散列";数据类型。

在第一种情况下,我更喜欢protobuf库(默认情况下,它包含在StackExchange.Redis.Extensions.protobuf-nuget包中)。但是,如果需要,您可以使用json/binary/xml序列化。

有一份关于他们所有人的良好业绩报告:https://medium.com/@maximun/serialization-performance-comparis-xml-binary-json-p-ad737545d227

示例:在下面创建辅助函数示例,在get/set之前使用了JSON SerializeObject/DeSerializeObject。但此解决方案具有对象大小不能超过Int32.MaxNumber(2147483647为2Gb)的限制。

样本代码

    public static void SetData<T>(string key, T data)
    {
        using (var redis = ConnectionMultiplexer.Connect("localhost:6379"))
        {
            IDatabase db = redis.GetDatabase();
            JavaScriptSerializer json_serializer = new JavaScriptSerializer();
            json_serializer.MaxJsonLength = int.MaxValue;
            db.StringSet(key, json_serializer.Serialize(data));
            redis.Close();
        }
    }
    public static T GetData<T>(string key)
    {
        using (var redis = ConnectionMultiplexer.Connect("localhost:6379"))
        {
            try
            {
                IDatabase db = redis.GetDatabase();
                var res = db.StringGet(key);
                redis.Close();
                if (res.IsNull)
                    return default(T);
                else
                    return JsonConvert.DeserializeObject<T>(res);
            }
            catch
            {
                return default(T);
            }
        }
    }