2016-12-19 6 views
0

これは初歩的なものです。私はredis-pyで回っていて、ロープを学んでいる。私がしようとしていることの一つは、次のとおりです。リストhash_objsで2つのRedisのハッシュがありましたredisで複数のhincrbyコマンドのパイプライン実行の結果を説明する

pipeline1 = my_server.pipeline() 
for hash_obj in hash_objs: 
    num = pipeline1.hincrby(hash_obj,"num",amount=-1) 
result1 = pipeline1.execute() 
print result1 
>>> [0L,0L] 

。私が画面に表示されるのは[0L,0L]です。誰かがこの出力が意味するものを解読するのを助けることができますか? Lとはなんですか?私はそれぞれhash_obj(例えば[2,0])に対してnumという結果のintの値を得ることを望んでいました。

私の目標は1によって各hash_objnumを増減することであり、num0として終わるどこ、hash_objを削除します。

私は2つの別々のパイプラインでこれを達成しようとしています。上記のコードはすべてのすべてのnumの値をデクリメントしようとしています。その後、保証があれば該当するhash_objsを削除します。私はredisでパイプラインを効果的に使う方法について私の理解を深めています。

答えて

0

上記のコードに何も問題はありません。Lはlong(整数)を意味し、実行前にハッシュが1に設定されていると仮定すると、結果のプリントアウトは一貫しています。あなたは、それぞれ、(3および以下の4ステップ)3と1に事前にハッシュを設定する場合は、手順9で期待される結果を得ることができます:

In [1]: import redis 

In [2]: r = redis.StrictRedis() 

In [3]: r.hset('h1', 'num', 3) 
Out[3]: 1L 

In [4]: r.hset('h2', 'num', 1) 
Out[4]: 1L 

In [5]: hashes = ['h1', 'h2'] 

In [6]: p = r.pipeline() 

In [7]: for h in hashes: 
    ...:  p.hincrby(h, 'num', -1) 
    ...:  

In [8]: res = p.execute() 

In [9]: res 
Out[9]: [2L, 0L] 

注:3で1Lと4というキーを意味し、作成されました。

これで、結果を反復処理して処理を続けることができます。ただし、あなたのケースでは、ただ1つのパイプラインを使うほうが意味があり、hincrbyを呼び出すとLuaスクリプトを呼び出すのではなく、結果が0の場合はキーを削除します(例えば、キーが削除済み):

In [1]: import redis 

In [2]: r = redis.StrictRedis() 

In [3]: r.hset('h1', 'num', 3) 
Out[3]: 0L 

In [4]: r.hset('h2', 'num', 1) 
Out[4]: 0L 

In [5]: s = r.script_load('if redis.call("HINCRBY", KEYS[1], ARGV[1], ARGV[2]) <= 0 then redis.call("DEL", KEYS[1]) return 1 end return 0') 

In [6]: p = r.pipeline() 

In [7]: for h in ['h1', 'h2']: 
    ...:  p.evalsha(s, 1, h, 'num', -1) 
    ...:  

In [8]: p.execute() 
Out[8]: [0L, 1L] 
関連する問題