web-dev-qa-db-ja.com

redis-pyのMULTIコマンドとEXECコマンドの同等の機能は何ですか?

すべてのトランザクションコマンド(MULTI、EXEC、WATCH、DISCARD)をredis-cliでテストしました。しかし、redis-pyを試してみると、次のエラーが発生しました。

AttributeError: 'Redis'オブジェクトに属性 'multi'がありません

次のコードスニペットを試しました。

import redis,time

r = redis.Redis()
try:
    r.set("transError",10)
    r.watch("transError")
    var = r.get("transError")
    var = int(var) + 1
    print "Run other client to simulate an error without transaction"
    time.sleep(4)
    r.multi()
    r.set("transError",var)
    r.execute()
    print "Value in first client",r.get("transError")

except redis.WatchError:
    print "Value Altered"

Multi()とexecute()を使用しているコード例を見ましたが、それらは私のために機能していません。何か助けはありますか?

20
Ahsanul Haque

Redis-pyでは、MULTIおよびEXECは Pipeline オブジェクトを介してのみ使用できます。

次のことを試してください。

_r = redis.Redis()
p = r.pipeline()
p.set("transError", var)
p.execute()
_

_redis-cli_を介してmonitorコマンドを使用すると、p.execute()が呼び出されたときに送信されるMULTI、SET、EXECを確認できます。 MULTI/EXECペアを省略するには、r.pipeline(transaction=False)を使用します。

28
ntki