1

不确定这是否是该问题的最佳标题......也许有人可以为我重命名它?

我的问题是关于在 Redis 的 c# ServiceStack 包装器中读取和组合数据的性能以及调用在内部如何工作。

我将解释两种有望产生最终结果的情景。一种情况是将类别 ID 列表附加到事务,以便可以独立存储类别。

问题:我的最终目标是检索所有具有“食物”类别的交易。

我试图对其他有助于我理解的要点进行编号。考虑有 10,000 笔交易,每笔交易平均有 3 个类别。

注意: ServiceStack.Net Redis中有一个相关问题:Storing Related Objects vs. Related Object Ids但是没有解释效率。

示例 A

public class Transaction
{
    public List<string> CategoryIds;
}

示例 B

public class Transaction
{
    public List<string> CategoryNames;
}

代码

var transactionClient = redisClient.GetTypedClient<Transaction>();

//1. is this inefficient returning all transactions?
//   is there any filtering available at this part?
var allTransactions = transactionClient.GetAll();

//2. In the case of Example A where the categories are stored as id's
//   how would I map the categories to a transaction?
//   maybe I have a List that has a container with the Transaction associated with a
//   list of Categories, however this seems inefficient as I would have to loop 
//   through all transactions make a call to get their Categories and then 
//   populate the container datatype.

//3. If we are taking Example B how can I efficiently just retrieve the transactions
//   where they have a category of food.
4

1 回答 1

0

效率是更少的网络调用更多的数据。Redis 中的数据只是变得模糊不清,大多数情况下,单个 API 调用会 1:1 映射到 redis 服务器操作。这意味着您可以将性能影响视为简单地从远程服务器的内存中下载一个 json 数据集 blob 并在客户端上对其进行反序列化——这实际上就是所有发生的事情。

在某些 API(如GetAll())中,它需要 2 次调用,1 次获取实体集中的所有 id,另一个获取具有这些 id 的所有记录。Redis 客户端的源代码非常容易理解,因此我建议您查看一下到底发生了什么。

因为您只有 3 个类别,所以通过尝试在服务器上进行过滤并没有节省多少额外数据。

所以你的选择基本上是:

  • 下载整个实体数据集并在客户端过滤
  • 从 Category > Ids 维护自定义索引映射
  • 更高级:使用服务器端 LUA 操作来应用服务器端过滤(需要 Redis 2.6)
于 2012-07-20T17:35:14.247 回答