5

redisを使用すると、データ構造全体を取得するコマンドが多数あります (リストの場合はLRANGE、セットの場合はSMEMBERS、ソート済みセットの場合はZRANGE 、ハッシュの場合はHGETALL )。

単一のコマンドで複数のアイテムを挿入するメソッド ( HMSET )があるのはハッシュだけです。

私が見たすべての例は、一度に 1 つの項目をリスト ( RPUSHまたはLPUSHを介して) またはセット ( SADD / ZADDを介して) に追加することを示しています。

私が解決したいより具体的な問題は、データベース ID を含むリストとソート済みセットを作成することです。これらのリストは各ユーザーに固有であり、数百から数千の ID が含まれています。

それらは通常、データベース クエリから収集され、メモリ内で少し処理されてから、(リスト) をページ分割するか、セット ベースの操作を実行してサブセット (セットと並べ替えられたセット) を取得するために、redis に格納されます。

現在、リストを繰り返し処理し、各要素に対して適切な add メソッドを呼び出しています。これには、ネットワーク上で複数のリクエストを作成し、毎回キーを繰り返すという欠点があります。

redis> RPUSH employee:ids 1000
(integer) 1
redis> RPUSH employee:ids 1001
(integer) 2
redis> RPUSH employee:ids 1002
(integer) 3
redis> RPUSH employee:ids 1003
(integer) 4
redis> del employee:ids
(integer) 1

MULTIEXECでトランザクションを使用すると、それを単一の要求に変えるのに役立つと思いますが、繰り返されるキーには役立ちません。

redis> MULTI
OK
redis> RPUSH employee:ids 1000
QUEUED
redis> RPUSH employee:ids 1001
QUEUED
redis> RPUSH employee:ids 1002
QUEUED
redis> RPUSH employee:ids 1003
QUEUED
redis> RPUSH employee:ids 1004
QUEUED
redis> EXEC
1. (integer) 1
2. (integer) 2
3. (integer) 3
4. (integer) 4
5. (integer) 5

1 つのコマンドで、または毎回キーを繰り返さずにリスト/セットに要素を追加できるようにするために、私が見逃しているものはありますか?

それが重要な場合(または、JVMから使用できる別のライブラリがあれば)、jedisクライアントライブラリも使用しています。

4

1 に答える 1

4

トランザクションを設定しても、ここでは役に立ちません。トランザクションの目的は、コマンドが同時に実行されるようにすることで、サーバー上に半分のリストが存在しないようにすることです。それらはまだ一度に 1 つずつ送信されます。

複数のコマンドが本当にパフォーマンスの問題を引き起こしていますか? 1000 個のアイテムは実際にはそれほど多くなく、アイテムごとに新しい接続を開くようなことをしていない限り、遅延の問題は発生しません。

于 2011-01-12T13:22:11.230 に答える