実際、Redisでコレクションを作成したいだけなら、1つのキーが必要です。
この例では、3つの異なるコレクションが作成され、それぞれに1つのアイテムが作成されています。これはおそらくあなたがやりたかったことではありません。あなたのコレクション内の項目の順序を追跡する必要がある場合は
x = $redis.smembers("work")
次のコードを使用して、このコレクションのすべてのアイテムを取得するには
$redis = Redis.new
$redis.sadd("work","the-first-task|1")
$redis.sadd("work", "another-task|2")
$redis.sadd("work", "yet-another-task|3")
:例は以下のように書き換えることができますセットの代わりにリストを使うほうがいいでしょう。
いずれにしても、KEYSコマンドの使用は、ツーリング/デバッグコードのみに制限する必要があります。これは、線形の複雑さのために実際のアプリケーションで使用するためのものではありません。
いくつかのコレクションを作成し、これらのコレクションすべてからアイテムを取得する必要がある場合は、おそらく新しいコレクションを導入してこれらのコレクションに対応するキーを追跡するのが最も良い方法です。
keys = $redis.smembers("catalog:work")
res = $redis.pipelined do
keys.each do |x|
$redis.smembers(x)
end
end
res.flatten!(1)
アイデアは、カタログの内容を取得するために最初のクエリを実行することです:仕事をし、その後に反復
$redis = Redis.new
$redis.sadd("catalog:work", "work:the-first-task")
$redis.sadd("catalog:work", "work:another-task")
$redis.sadd("work:the-first-task", 1)
$redis.sadd("work:the-first-task", 2)
$redis.sadd("work:another-task", 3)
$redis.sadd("work:another-task", 4)
が効率的にすべてのアイテムを取得するには:例えば
パイプラインを使用してすべてのデータを取得します。私はRubyユーザではないので、おそらくそれを実装するための慣用的な方法があります。
あなたが取得したいコレクションの数が限られている場合、あなたは(設定は各項目を格納されている)アイテムの所有権を気にしない場合は別の単純なオプションを使用することができ
keys = $redis.smembers("catalog:work")
res = $redis.sunion(*keys)
ここではSUNIONコマンドを使用して、関心のあるすべてのセットを結合したセットを作成します。また、結果の重複を除外します(これは前の例では行われていません)。
注意:これは線形演算です。数百万の鍵があれば、数秒間Redisインスタンス全体がフリーズします。 –
@DidierSpezia、これを達成する正しい方法は何でしょうか? – Autodidact
コレクションを扱うには、私の一般的な答えを参照してください。これで、キーのサブセット(KEYSの仕事:*など)を実際に取得したい場合は、直接操作しないでください。興味のあるキーを含む別のコレクション(たとえば、セット)を維持してから、このコレクションを読み込む必要があります。 –