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

Gay*_*gha 21 .net c# redis stackexchange.redis

我可以通过使用,在ServiceStack.redis中执行此操作,

IRedisTypedClient<ObjectName> myObj = redisClient.As<ObjectName>();
Run Code Online (Sandbox Code Playgroud)

但我在StackExchange.Redis中找不到任何示例.

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

Thanx提前.

Mar*_*ell 22

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


Nig*_*ist 9

最简单的解决方案是使用json/binary/other序列化.更复杂但更原生 - 使用redis "哈希"数据类型.

在第一种情况下我喜欢的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/


Ton*_*one 5

示例:创建下面的辅助函数示例,在 get/set 之前使用 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);
            }

        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 正如文档中提到的,您不应在每次想要访问数据时都使用“ConnectionMultiplexer.Connect”。您应该存储连接并每次使用轻量级“GetDatabase()”。 (8认同)