2012-04-14 7 views
22

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

例:私はそれが"users:1", "users:2"を返しredis.get events:1:attendees

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

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

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

。私はこのリストをループしてユーザーを得ることができます:1、ユーザー:2を取得します。しかし、これは間違っている、1つのすべての出席者の情報を取得する方法はありますか?

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

をしかし、Redisの中で、私はそれがキーではなく、そのキーに格納されている実際のオブジェクトを返すことができないので:レールで

私はこのような何かをするだろう。

感謝:)

答えて

38

項目をループして各要素に同期的にアクセスすることはあまり効率的ではありません。 Redisの2.4では、あなたがやりたいことには、さまざまな方法があります:可変引数パラメータを使用して、パイプライン

  • を使用してsortコマンド
  • を使用して

    • あなたは、Redisの2.6

    コマンドLuaスクリプトを使うこともできますが、これは実際には必要ありません。

    ところで、説明したデータ構造は、ハッシュを使用することで改善できます。ユーザーデータを別々のキーに格納する代わりに、それらをハッシュオブジェクトにグループ化することもできます。あなたは1回の往復でデータを取得するためのRedisのsortコマンドを使用することができますsortコマンドに

    を使用して

    。パイプライン

    Rubyのクライアント・サポート・パイプライン(Redisのに複数のクエリを送信し、いくつかの応答を待つ、すなわち能力)を使用して

    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" 
    

    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回の往復です。これは、取得するキーの数が限られていることを保証できる場合に機能します。そうでない場合は、パイプライニングがはるかに優れたソリューションです。

  • +0

    返信いただきありがとうございます!あなたの提案したコードを試してみましょう!ありがとう:) –

    +0

    ありがとう@ディディエ、常に新しいことを学ぶのは良い! –

    5

    あなたはそれをLua scriptを送信するためにループ 『サーバ側を』実行し、ブロック内の結果を返すことのRedis' EVALコマンドを使用することができます。

    関連する問題