sql >> データベース >  >> NoSQL >> Redis

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

    アイテムでループを実行し、各要素に同期的にアクセスすることは、あまり効率的ではありません。 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回です。これは、取得するキーの数が制限されていることを保証できる場合に機能します。そうでない場合は、パイプライン処理の方がはるかに優れたソリューションです。



    1. MongoDB正規表現、インデックス、パフォーマンス

    2. この単一の同時実行分散キューを任意のMQプラットフォームに実装するにはどうすればよいですか?

    3. マングーススキーマの移行を適切に処理するにはどうすればよいですか?

    4. MongoDB:集約フレームワーク:フィールド間の$ match