私は現在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では、キーが返され、そのキーに格納されている実際のオブジェクトは返されないため、私はできません。
ありがとう:)
アイテムに対してループを実行し、各要素に同期的にアクセスすることは、あまり効率的ではありません。 Redis 2.4では、さまざまな方法で必要な操作を実行できます。
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つの往復です。これは、取得するキーの数が制限されていることを保証できる場合に機能します。そうでない場合は、パイプライン処理がはるかに優れたソリューションです。
Redisの [〜#〜] eval [〜#〜] コマンドを使用して、ループ「サーバー側」を実行して結果を返す Luaスクリプト を送信できます。ブロック。