2012-01-03 8 views

答えて

1

まあ、私は$redis.keys("work:*")でそれを得ることができました。

+1

注意:これは線形演算です。数百万の鍵があれば、数秒間Redisインスタンス全体がフリーズします。 –

+1

@DidierSpezia、これを達成する正しい方法は何でしょうか? – Autodidact

+0

コレクションを扱うには、私の一般的な答えを参照してください。これで、キーのサブセット(KEYSの仕事:*など)を実際に取得したい場合は、直接操作しないでください。興味のあるキーを含む別のコレクション(たとえば、セット)を維持してから、このコレクションを読み込む必要があります。 –

2

実際、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コマンドを使用して、関心のあるすべてのセットを結合したセットを作成します。また、結果の重複を除外します(これは前の例では行われていません)。

+0

ありがとう、実際には、質問を簡単にするためにコレクションごとに価値を追加しました。しかし、あなたが言ったように、それは3つのコレクションセットを作成します。後ですべてのコレクションに値を追加します。私は単にキー 'work'を使ってコレクションを作ることはできません。アプリケーションロジックはすべてのコレクションで一意性を必要とするので、その例はそのようにしています。私はそれをもう一度考え直さなければならないと思う。 – Autodidact

+0

私は答えを更新して、n個のコレクションの内容を取得するための例を追加しました。それが役に立てば幸い ... –

関連する問題