2016-11-18 7 views
0

pythonクライアントを使用して、redisで実装されたパイプラインの概念をクリアしようとしています。次の例を参照してください。redisで一括処理するパイプラインを使用する(Pythonの例)

my_server = redis.Redis(connection_pool=POOL) 
for obj_id in list_of_obj_ids: 
    hash_name="n:"+str(obj_id) 
    sorted_set = "s:"+str(obj_id) 
    if my_server.exists(hash_name): 
     my_server.hset(hash_name,'val',0) 
    if my_server.zcard(sorted_set): 
     my_server.zadd(sorted_set, hash_name, time.time()) 

Ie. forループを繰り返して複数のハッシュを更新しています。この種の一括更新をパイプライン処理でどのように達成できますか?私が読んだことから、次のことが私の頭に浮かぶものです:

my_server = redis.Redis(connection_pool=POOL) 
p = my_server.pipeline() 
for obj_id in list_of_obj_ids: 
    hash_name="n:"+str(obj_id) 
    sorted_set="s:"+str(obj_id) 
    if p.exists(hash_name): 
     p.hset(hash_name,'val',0) 
    if p.zcard(sorted_set): 
     p.zadd(sorted_set, hash_name, time.time()) 
p.execute() 

これは間違いありませんか?

答えて

0

pipeliningは/ doesで、これがうまくいかない理由を理解しておいてください。executeパイプラインまで、それに含まれるコマンドはどれもサーバーに送られません。それはあなたの条件文があなたが念頭に置いていた目的を逃すことになります。

+0

Itamarを助けてくれてありがとう。私はそのセクションを読んだことがあります(それがパイプラインを再開する方法です)。しかし、私は '実行する '方法についてまだ不明です。私の例では、forループの外側で 'p'の' execute'メソッドを呼び出します。それは私の頭の中で意味がありました。なぜなら、このように考えれば、forループが完了するとすべてのコマンドが一括して実行されるからです。 –

+0

正確には、 'exists'と' zcard'コールは実行時にのみ発生し、ループ内には発生しません。 –

+0

です。その場合は、forループの中で 'p.execute()'を(最後に)移動する必要があります。しかし、 'execute()'メソッドをループ内に置かないので、複数回呼び出すことはできません。つまり、私の例では、forループの外側に 'p.execute() 'を置いた方が正しいアプローチだったのでしょうか? –

関連する問題