1

それが質問に最適なタイトルかどうかわからない...誰かが私のために名前を変更できるかもしれませんか?

私の質問は、Redis用のc#ServiceStackラッパーでのデータの読み取りと結合のパフォーマンスと、呼び出しが内部でどのように機能するかに関するものです。

最終結果が得られると期待される2つのシナリオについて説明します。1つのシナリオでは、カテゴリIDのリストがトランザクションに添付されているため、カテゴリを個別に保存できます。

質問:私の最終目標は、カテゴリ「食品」を持つすべてのトランザクションを取得することです。

私は、明快さが私の理解に役立つ他の点を数えようとしました。10,000のトランザクションがあり、各トランザクションには平均3つのカテゴリがあると考えてください。

注: ServiceStack.Net Redisには関連する質問があります:関連オブジェクトと関連オブジェクトIDの保存では、効率については説明されていません。

例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呼び出しがredisサーバー操作と1:1でマッピングされます。つまり、パフォーマンスへの影響は、リモートサーバーのメモリからjsonデータセットblobをダウンロードし、クライアントで逆シリアル化するだけであると考えることができます。これが事実上すべてです。

GetAll()などの一部のAPIでは、2つの呼び出しが必要です。1つはエンティティセット内のすべてのIDをフェッチし、もう1つはそれらのIDを持つすべてのレコードをフェッチします。Redisクライアントのソースコードは非常に親しみやすいので、何が起こっているのかを正確に確認することをお勧めします。

カテゴリは3つしかないため、サーバーでフィルタリングしようとして節約できる余分なデータはそれほど多くありません。

したがって、基本的にオプションは次のとおりです。

  • エンティティデータセット全体をダウンロードし、クライアントでフィルタリングします
  • カテゴリ>IDからカスタムインデックスマッピングを維持する
  • より高度な機能:サーバー側のLUA操作を使用してサーバー側のフィルタリングを適用します(Redis 2.6が必要です)
于 2012-07-20T17:35:14.247 に答える