基本书架加上Protobuf-net加Lists / SortedSets,实现?

时间:2012-04-16 19:49:34

标签: c# redis protobuf-net booksleeve

关于将书架与protobuf-net结合使用,我有一些相当基本的问题。现在我已经实现了一个单例类来管理连接,所以我重复使用相同的连接多次recommended。现在我有几个关于组合实际使用的问题:

  1. “db”int和“key”字符串有什么区别/重要性?
  2. 如何使用protobuf-net将一堆对象序列化为SortedSet / List?
  3. 如何使用protobuf-net从SortedSet / List反序列化一堆对象?
  4. 我在想我应该使用Range()方法进行检索:

        public IList<T> RetrieveAllAsList()
        {
            var conn = RedisConnectionManager.Current.GetConnection();
            conn.Open();
    
    
            int length = (int)conn.Lists.GetLength(10, "idk").Result;
            byte[][] data = conn.Lists.Range(10, "idk", 0, length-1).Result;
    
            List<T> output = new List<T>();
            for (int i = 0; i < data.Length; i++)
            {
                using (MemoryStream ms = new MemoryStream(data[i]))
                {
                    output.Add(Serializer.Deserialize<T>(ms));
                }
            }
    
            conn.Close(false);
            return output;
        }
    

    我很感激这方面的任何帮助。谢谢。

2 个答案:

答案 0 :(得分:2)

  

&#34; db&#34;有什么区别/重要性? int和&#34; key&#34;字符串?

Redis允许您将数据分区为多个数据库。例如,在stackexchange网站上,您可以在db = 0中存储stackoverflow.com相关内容,并在db = 1中存储与programmers.se.com相关的内容。

在每个数据库中,您都有key = value对。密钥始终是String。该值可以是以下五种数据类型之一 - 字符串,列表,集,排序集或映射。

传统的Redis客户端不会强制您提供数据库编号。如果您没有提供,则假设db = 0。但Booksleeve要求您提供数据库编号。如果您不在乎,只需将0传递给所有API调用。

字符串键必须是唯一的,并且完全取决于应用程序。例如,要存储用户对象,通常的方法是使用user:1190099之类的键,将值作为带有键值=值的映射,如{"name":"singlelabs", "id":1190099 ... }

  

如何使用protobuf-net将一堆对象序列化为SortedSet / List?   如何使用protobuf-net从SortedSet / List反序列化一堆对象?

首先,您需要决定是否要使用协议缓冲区。

协议缓冲区可以将复杂对象序列化/反序列化为二进制blob。这个blob对Redis来说是不透明的。换句话说,您可以设置或获取此二进制blob,但不能使用任何其他Redis功能。

如果你真的想使用Redis&#39;列表和排序集,您应该使用BookSleeve提供的API。我还没有使用Booksleeve,但是以下两个接口应该解释如何将数据插入到list / sortedset中。

http://code.google.com/p/booksleeve/source/browse/BookSleeve/ISortedSetCommands.cs

http://code.google.com/p/booksleeve/source/browse/BookSleeve/IListCommands.cs

答案 1 :(得分:1)

Sripathi已经很好地解释了数据库密钥的内容。需要的原因是BookSleeve作为多路复用器工作,所以你 使用数据库需要传递它以避免不同调用者使用不同数据库时的竞争条件。如果您没有使用多个数据库,只需传递0。

重新序列化/反序列化 - 这是故意单独完成的,因此调用者可以为它们使用适当的序列化 - 因此BookSleeve只知道字符串和blob。你的序列化代码看起来还不错。

我唯一的批评就是没有必要先获得长度。 intellisense应该说明用法 - 我希望传递-1或int.MaxValue将列出所有项目而不需要先获得长度(道歉是模糊的,但我在离境休息室)。这可以避免网络旅行。