2017-01-04 4 views
0

私はredisに保存するジョブをたくさん持っています。それぞれは特別なキーで識別され、ハッシュ値には情報が含まれています。これらのジョブは、ピックアップされ、計算され、実行されると、successフィールドがあり、計算が正常に終了した場合は、trueに設定されます。値のハッシュ値がtrueに設定されたsuccessキーを持つすべてのキーのリストを作成したいとします。Redis:ある基準に等しい値を持つキューからすべてのキーを取得する

Redisのストレージ:

foo_key_1 => {bar_hash_key: bar_value, baz_hash_key: baz_value, success: true} 
foo_key_2 => {bar_hash_key: bar_value, baz_hash_key: baz_value, success: false} 

上記の例では、私はすべてのRedisの中にキーとその成功のフィールドを介してスキャンのシンプルで効率的な方法のように、結果として[foo_key_1]で終わるだろう。 O(Nはいえ

# redis is a connection to my redis server 
all_keys = redis.keys      # list of all keys in redis 
for i in all_keys do      # iterate through all keys in redis 
    if (redis.hgetall i)["success"] == true # if that key has success = true attrib 
    completed_keys.append(i)    # append that key to a new list 
    end 
end 

問題お察しの通り、私はRedisの上のキーのたくさんを持っており、このされ、:

次のように現在、私のアプローチは、(ルビー擬似コードで)です)のパフォーマンスは、その反復的性質のために、パフォーマンスに関してかなり遅くなる。私はredisドキュメント/コマンドを徹底的に見てきましたが、この問題を解決する潜在的な候補者として私を打ち破ったことはありません私はレディス・グルではありませんが、かなり簡単です。私が見落としている可能性のあるベクター化された操作はありますか?

多くのありがとうございます。

答えて

2

redisはキーの取得のみをサポートしているため、すべてのキーを繰り返し実行することはできません。この場合でも、redisはすべてのキーをバックグラウンドでフェッチします(いくつかの最適化で、バッチでそれらをフェッチするため)http://www.rubydoc.info/github/redis/redis-rb/Redis:scan)キーのパターンを知っていると複雑さを軽減できます。何かのように:

$redis.scan_each(match: "foo*").to_a 

あなたはキーがあなたがそれらはあなたを助けるために少しヒントを使用して値を取ることができます取る値かを制御することができた場合、https://redis.io/commands/KEYS

しかしここに独自のパターンを作成する方法を見つけることができますこの検索で​​は、のような:

  • のは、このフォームで各キーを作ってみよう "のfoo#{your_number}:#{success_bool}"
  • 検索はこのパターン "FOO *:1" を使用する場合
  • を0
+0

こんにちは@Razvan、応答ありがとうございます。これは私が来たのとほぼ同じ結論ですが、実際にはキーを変更する必要がないので、この時点でかなり明確にレイアウトされています。まあ、少なくとも今私は自分の選択肢を知っている! – Stuart

1

Redisのみを効率的に使用するには、成功した/完了したキーの "Redis-queryable"、SETまたはLISTを更新する必要があります。

基本的なレベルでは、実際にジョブキュー(および成功した最初のジョブのための2番目のジョブキュー)のように聞こえます。具体的にこれを自分で実装したいのでない限り、ジョブキューの実装を調べましたか?

関連する問題