1

私はRedisが初めてで、いくつかのオブジェクトを保存するためにredisハッシュを使い始めましたが、非常に予期しないパフォーマンスの問題に遭遇しました。VMware プレーヤーでローカルにホストされている Ubuntu マシンで redis を実行しています。

私の vm は、4 GB のメモリを備えた 2 つのコアです。

私が試しているコードはこちらです。

using (var redis = new RedisClient())
{              
    using (var client = redis.As<MyClass>())
    {
        var hash = client.GetHash<Guid>("urn:class");                   
        var items = hash.Values;
    }
}

ハッシュには、エンティティ モデルから追加された約 2000 のアイテムが含まれています。ハッシュからすべての値を取得するには、私の実行中に 7 秒かかります。これは、私のインスタンスに redis が持っている小さなハードウェアであっても、かなり高いようです。同じデータに対する通常の LINQ to Entity クエリには、.25 秒かかります。

ここで私が間違っていることはありますか?これは、redis のパフォーマンスについて私が聞いたすべての素晴らしいことを考えると、間違っているように思えます。

編集: 2013 年 7 月 12 日

これは WCF の問題のようです。この投稿Redis を使用して Web サービスをスケーリングすると、基本的に私の結果が反映されます。私がテストするためにしたことはこれでした。

1683 個のオブジェクトで Redis ハッシュを取得する

  • IIS の WCF サービス: 7 秒
  • ASP.NET Web API: 0.8 秒
  • 楽しみのための NodeJS: 0.8 秒

Web Api と Node は魔法のように動作し、redis-benchmark を実行したときとほぼ同じように動作しました。

4

1 に答える 1

1

私の問題は、Redis クライアントのコンテキストとして使用していたクラスにありました。このクラスは、オブジェクト コンテキストを持つ古いバージョンのエンティティ フレームワークを使用して生成されたエンティティ モデルでした。エンティティが生成される方法により、ServiceStack.Redis クライアントは、Redis から返されるオブジェクトを逆シリアル化するために大量の作業を行う必要がありました。エンティティ ナビゲーション プロパティの set メソッドには、

InitializeRelatedCollection()

これは、json パーサーが Redis クライアントを介して返されるオブジェクトを逆シリアル化する必要があるたびに呼び出されていました。ナビゲーション プロパティを持たない単純なオブジェクトに切り替えると、問題なく動作し、他のテストと同様に予想どおりの数値に戻りました。

ASP.NET Web API でこの速度低下が見られなかった理由は、エンティティが新しい DbContext モデルを使用して生成され、ServiceStack の Json シリアライザーが WCF で行っていたほど多くの作業を行う必要がなかったためです。ナビゲーション プロパティは単純なリストまたはコレクションであるためです。

そもそもエンティティ オブジェクトを Redis クライアントの型にすることは、おそらく良い考えではありませんでした。

于 2013-07-13T03:44:54.860 に答える