1

关于将 bookleeve 与 protobuf-net 结合使用,我有一些相当基本的问题。现在我已经实现了一个单例类来管理连接,因此我按照推荐的方式多次重复使用相同的连接。现在我有几个关于实际使用组合的问题:

  1. “db” int 和“key” 字符串的区别/重要性是什么?
  2. 如何使用 protobuf-net 将一堆对象序列化为 SortedSet/List?
  3. 如何使用 protobuf-net 从 SortedSet/List 反序列化一堆对象?

我在想我应该使用 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;
    }

我将不胜感激在这件事上的任何帮助。谢谢你。

4

2 回答 2

2

“db” int 和“key” 字符串的区别/重要性是什么?

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

在每个数据库中,您都有 key = value 对。键始终是字符串。该值可以是以下五种数据类型之一 - String、List、Set、Sorted Set 或 Map。

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

但是,字符串键必须是唯一的,并且完全是特定于应用程序的。例如,要存储一个用户对象,通常的技术是有一个像 一样的键user:1190099,而值是一个带有键=值对的 Map,比如{"name":"singlelabs", "id":1190099 ... }

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

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

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

如果你真的想使用 Redis 的列表和排序集,你应该使用 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

于 2012-04-16T20:58:04.733 回答
1

Sripathi 已经很好地解释了 DB 密钥什么。需要它的原因是 BookSleeve 用作多路复用器,因此当不同的调用使用不同的数据库时,需要传递它以避免竞争条件。如果您不使用多个数据库,只需传递 0。

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

我唯一的批评是没有必要先得到长度。智能感知应该说明用法 - 我希望通过 -1 或 int.MaxValue 将列出所有项目,而无需先获取长度(抱歉含糊不清,但我在候机室)。这避免了网络旅行。

于 2012-04-17T06:55:13.640 回答