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

时间:2014-08-27 20:23:23

标签: c# .net redis stackexchange.redis

我可以使用

在ServiceStack.redis中执行此操作
IRedisTypedClient<ObjectName> myObj = redisClient.As<ObjectName>();

但我无法在StackExchange.Redis中找到任何示例。

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

提前完成。

3 个答案:

答案 0 :(得分:21)

目前,SE.Redis并没有尝试提供序列化 - 有太多不同的方法可以做到这一点。我更倾向于认为库应该做一件事,而不是7.应该可以通过扩展方法或其他管道/包装代码添加任何混合序列化等问题,选择您选择的任何序列化策略,以及任何库你选择。

答案 1 :(得分:8)

最简单的解决方案是使用json / binary /其他序列化。更复杂但更原生 - 使用redis "hashes" data type

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

关于所有人的报告都很好:http://www.maxondev.com/serialization-performance-comparison-c-net-formats-frameworks-xmldatacontractserializer-xmlserializer-binaryformatter-json-newtonsoft-servicestack-text/

答案 2 :(得分:0)

示例:在下面创建帮助函数示例,在获取/设置之前使用JSON SerializeObject / DeSerializeObject。但是此解决方案具有以下限制:对象大小不能超过Int32.MaxNumber(2,147,483,647为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);
            }

        }
    }