【问题标题】:What are equivalent functions of MULTI and EXEC commands in redis-py?redis-py中MULTI和EXEC命令的等效功能是什么?
【发布时间】:2015-10-24 11:45:39
【问题描述】:

我在 redis-cli 中测试了所有的事务命令(MULTI、EXEC、WATCH、DISCARD)。但是当我尝试使用 redis-py 时出现以下错误:

AttributeError: 'Redis' 对象没有属性 'multi'

我试过下面的代码sn-p:

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() 的代码示例,但它们对我不起作用。有什么帮助吗?

【问题讨论】:

    标签: python redis redis-py


    【解决方案1】:

    在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)

    【讨论】:

    • 这个答案看起来很完美。虽然我有一个问题:有多少命令可以一起有效地执行?如果我在一个管道中传递 500000 个命令可以吗?或者对于 redis 来说太多了?
    • @TusharJDudhatra 您确实必须为您的个人应用程序自行衡量。以我的经验,虽然通常最好只将合理数量的命令一起批处理......比如其中的 10000 个。同样在 redis-py 中,管道在执行时会立即发送所有命令,而不是连续发送,无论 transaction=False。见:redis.io/topics/pipelininggithub.com/schlitzered/pyredis/issues/2
    • 感谢您的回复。是的,我尝试在一个管道中执行 500K 命令,并且对我来说很顺利。
    • 如果我需要执行读取请求怎么办?我尝试以原子方式递增 json 中的值,该值作为字符串存储在 Redis 中。可能吗?顺便说一句,我不能使用 RedisJSON,因为我的供应商还不支持它。
    • 我找到了一个解决方案:只需将我想要增加的值存储在不同的键中! :)
    猜你喜欢
    • 2020-07-11
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多