2

ServiceStack を使用して、複数の読み取りコマンド (特に、ContainsKey コマンド) を実行する方法はありますか?

保存されたオブジェクトはデータベースからフェッチするのに時間がかかるため、キャッシュにないオブジェクトのみを取得しようとしています。

redis にオブジェクトを要求し、null が返された場合はデータベースから取得できることはわかっていますが、格納されているオブジェクトはかなり大きいため、bool のリストを取得して、クエリする ID を決定するだけで済みます。そこからデータベースに。

当面は、ID のリスト (最大 100 程度) をループ処理し、servicestack で ContainsKey メソッドを使用します。私はすべてのやり取りを避け、すべての要求を 1 回で行うことを目指しています。

4

1 に答える 1

3

ServiceStack.Redisクライアントでは、or GetValues(GetValuesMap文字列と T API の両方が利用可能) を使用して、1 回の呼び出しで複数の値をフェッチ ( MGETを使用) できます。モデルにIdがあるか、既存のキーとその値の辞書を返すGetValues場合に検出できる既存のアイテムのみが返されます。GetValuesMap

これにより、欠落しているすべての ID を特定してデータベースから取得できます。とにかく Redis から既存の値を取得するだけの場合は、1 回の呼び出しですべての値を取得して既存のキーを特定できるため、これが最適な戦略です。

代替の「シングル コール」オプション

パイプラインまたはトランザクションを使用する

なんらかの理由で、キーを取得せずに本当に Redis 内のキーの存在を確認したい場合は、トランザクションまたはパイプライン (どちらもパイプライン化されています) を使用して、1 つのソケット書き込みで Redis に送信される複数の操作をキューに入れることができます。これはRedisStackOverflowデモからのこの例で、単一のバッチで送信および実行される30 の操作をキューに入れます。

LUA スクリプトを使用する

Redis >v2.5x を使用している場合は、 Redis のサーバー側 LUA サポートを使用して複合操作を作成および実行できます。ServiceStack.Redis クライアントのIRedisClientからこれらの API を使用して、サーバー側の LUA スクリプトを実行できます。

string GetEvalStr(string body, int numOfArgs, params string[] args);
int GetEvalInt(string body, int numOfArgs, params string[] args);
List<string> GetEvalMultiData(string body, int numOfArgs, params string[] args);
于 2012-06-07T18:03:29.567 に答える