2016-08-16 3 views
1

私は最近servicestack.redisを使用していましたが、IRedisTypedClientからクエリが必要です。私はすべてのデータが記憶されていることを知っていますが、依然として知りたいのですが、GetAll().Where()GetByIds()の間に速度差がありますか?servicestack.redis GetAll()。()とGetByIds()との間に速度差がありますか?

GetAll()およびGetByIds()は、servicestack.redisによって提供される2つの方法です。

GetAll()を使用して結果を(ラムダで)検索することができます。つまり、いくつかのカスタム条件を使用できますが、わかりません。これは、赤いメモリのすべてのデータを読み込み、IEnumable<T>、速度はGetByIds()より遅くなります。

+1

ベストアンサーには、それを試してみることです... – BugFinder

+0

@BugFinderあなたは正しいです、私は今夜試してみると、私はあなたの人に知らせる。 – Bucketcode

答えて

2

私はちょうど実験をしました。私は100万個のオブジェクトを保存しました(ps:サービスマンのバグがあり、1回だけ約50万個のオブジェクトを保存できます)。

これらの2つの方法で照会します。

DateTime beginDate = DateTime.Now; 
Debug.WriteLine("查询1开始");` 
Website site = WebsiteRedis.GetByCondition(w => w.Name == "网址2336677").First(); 
double time = (DateTime.Now - beginDate).TotalMilliseconds; 
Debug.WriteLine("耗时:" + time + "ms"); 

DateTime beginDate2 = DateTime.Now; 
Debug.WriteLine("查询2开始"); 
Website site2 = WebsiteRedis.GetByID(new Guid("29284415-5de0-4781-bea4-5e01332814b2")); 
double time2 = (DateTime.Now - beginDate2).TotalMilliseconds; 
Debug.WriteLine("耗时:" + time2 + "ms"); 

結果は
GetAll().Where()ある -
GetById()、19秒かかる - 190msを取ります。

私はそれがすべてのオブジェクトは、IDと関連し、クエリとしてGetById()を使用する必要があり、クエリとしてGetAll().Where()を使用しないので、決して、redisキーとしてservicestack使用のオブジェクトIDためだと思います。 GetAll()は、レコードの少ないオブジェクトで使用する必要があります。

+1

スクリーンショットのコードは使用しないでください。 – Liam

+0

にコードを貼り付けてください。初めてstackoverflowを使用してください。 – Bucketcode

+0

soooこれを修正しますか? – Liam

2

GetAll and GetByIdsの実装を見て、その動作を確認できます。

GetByIdsだけのすべての値を取得する単一MGET要求を作成するGetValues()を呼び出し、各エントリは、次に下に格納されている完全修飾キーにすべてのIDを変換する:

public IList<T> GetByIds(IEnumerable ids) 
{ 
    if (ids != null) 
    { 
     var urnKeys = ids.Map(x => client.UrnKey<T>(x)); 
     if (urnKeys.Count != 0) 
      return GetValues(urnKeys); 
    } 

    return new List<T>(); 
} 

public IList<T> GetAll() 
{ 
    var allKeys = client.GetAllItemsFromSet(this.TypeIdsSetKey); 
    return this.GetByIds(allKeys.ToArray()); 
} 

GETALLはTypeIdsSetKeyからすべてのIDをフェッチ(つまり、そのタイプのすべてのIDを含むRedis SET)は、GetByIds()を呼び出します。

GetByIdsは、Redisへの呼び出しを少なくするために高速化されますが、一緒に2回のRedis操作しか行いません。

注ので、これは効率的ではありません彼らは両方のList<T>はそうあなたがさらに返される結果をフィルタリングするためにLINQを使用することができますメモリ.NETに戻りますが、それはそのタイプためすべての結果を返し、フィルタリングは、クライアント上で実行されます大規模なデータセットの場合代わりに、よくある質問についてはcreating manual indexes using Redis SETsを見てください。

+1

素晴らしい、私はちょうどあなたが答えにリンクされた質問を読んで、あなたのプロフィールをチェックして、あなたは同時に私に答えることが分かります。 – Bucketcode

関連する問題