アイテムでループを実行し、各要素に同期的にアクセスすることは、あまり効率的ではありません。 Redis 2.4では、やりたいことを行うためのさまざまな方法があります。
- 並べ替えコマンドを使用する
- パイプライニングを使用する
- 可変個引数パラメータコマンドを使用する
Redis 2.6では、Luaスクリプトを使用することもできますが、ここでは実際には必要ありません。
ちなみに、あなたが説明したデータ構造は、ハッシュを使用することで改善される可能性があります。ユーザーデータを個別のキーに保存する代わりに、ハッシュオブジェクトにグループ化することができます。
並べ替えコマンドの使用
Redisの並べ替えコマンドを使用して、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コマンドを使用すると、1回のショットで複数のデータを取得できます。
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回です。これは、取得するキーの数が制限されていることを保証できる場合に機能します。そうでない場合は、パイプライン処理の方がはるかに優れたソリューションです。