【问题标题】:How to store user defined objects using StackExchange.Redis?如何使用 StackExchange.Redis 存储用户定义的对象?
【发布时间】:2014-10-21 13:53:19
【问题描述】:

我可以在 ServiceStack.redis 中使用,

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

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

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

提前感谢。

【问题讨论】:

    标签: c# .net redis stackexchange.redis


    【解决方案1】:

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

    【讨论】:

    • 那么解决方案是另一个抽象层?我很欣赏 StackExchange.Redis 是一个相当简单的客户端,其他问题应该作为扩​​展来实现。对github.com/imperugo/StackExchange.Redis.Extensions 有任何想法吗?另外,非常感谢您!
    【解决方案2】:

    最简单的解决方案是使用 json/binary/other 序列化。更复杂但更原生 - 使用 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/

    【讨论】:

      【解决方案3】:

      示例:在下面创建辅助函数示例,在 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);
                  }
      
              }
          }
      

      【讨论】:

      • 如文档中所述,您不应在每次要访问数据时都使用ConnectionMultiplexer.Connect。您应该存储连接并每次使用轻量级GetDatabase()
      • 无需在 using 块的主变量上调用 .close()。
      • 当您只需要偶尔连接以保存/获取一些值时,这很好用,因此存储活动连接是无用的。
      猜你喜欢
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      • 2013-12-30
      • 2011-03-30
      相关资源
      最近更新 更多