web-dev-qa-db-ja.com

Redisから複数のキー値を取得する

私は現在Redisをいじっていますが、いくつか質問があります。キーの配列から値を取得することは可能ですか?

例:

users:1:name "daniel"
users:1:age  "24"

users:2:name "user2"
users:2:age  "24"

events:1:attendees "users:1", "users:2"

redis.get events:1:attendeesの場合、"users:1", "users:2"を返します。このリストをループしてusers:1を取得し、users:2を取得します。しかし、これは間違っていると感じます。1getですべての参加者情報を取得する方法はありますか?

Railsでは、次のようにします:

@event.attendees.each do |att|
  att.name
end

しかし、redisでは、キーが返され、そのキーに格納されている実際のオブジェクトは返されないため、私はできません。

ありがとう:)

22

アイテムに対してループを実行し、各要素に同期的にアクセスすることは、あまり効率的ではありません。 Redis 2.4では、さまざまな方法で必要な操作を実行できます。

  • sortコマンドを使用する
  • パイプラインを使用して
  • 可変パラメータコマンドを使用する

Redis 2.6では、Luaスクリプトを使用することもできますが、これは実際には必要ありません。

ちなみに、あなたが説明したデータ構造は、ハッシュを使用することで改善できるでしょう。ユーザーデータを個別のキーに保存する代わりに、ハッシュオブジェクトにグループ化できます。

sortコマンドを使用

Redisのsortコマンドを使用して、1回の往復でデータを取得できます。

redis> set users:1:name "daniel"
OK
redis> set users:1:age 24
OK
redis> set users:2:name "user2"
OK
redis> set users:2:age 24
OK
redis> sadd events:1:attendees users:1 users:2
(integer) 2
redis> sort events:1:attendees by nosort get *:name get *:age
1) "user2"
2) "24"
3) "daniel"
4) "24"

パイプラインを使用

Rubyクライアントはパイプライン処理をサポートしています(つまり、Redisに複数のクエリを送信し、複数の応答を待つ機能)。

keys = $redis.smembers("events:1:attendees")
res = $redis.pipelined do
   keys.each do |x|
      $redis.mget(x+":name",x+":age")
   end
end

上記のコードは、2回の往復のみでデータを取得します。

可変パラメータコマンドを使用

MGETコマンドを使用して、一度に複数のデータを取得できます。

redis> smembers events:1:attendees
1) "users:2"
2) "users:1"
redis> mget users:1:name users:1:age users:2:name users:2:age
1) "daniel"
2) "24"
3) "user2"
4) "24"

ここでのコストも2つの往復です。これは、取得するキーの数が制限されていることを保証できる場合に機能します。そうでない場合は、パイプライン処理がはるかに優れたソリューションです。

38
Didier Spezia

Redisの [〜#〜] eval [〜#〜] コマンドを使用して、ループ「サーバー側」を実行して結果を返す Luaスクリプト を送信できます。ブロック。

5
Ofer Zelig