从我正在阅读的“Redis in Action”一书中,我看到了以下示例,现在我想知道这是否正确。该示例在python中有以下代码:

def purchase_item(conn, buyerid, itemid, sellerid, lprice):
buyer = "users:%s"%buyerid
seller = "users:%s"%sellerid
item = "%s.%s"%(itemid, sellerid)
inventory = "inventory:%s"%buyerid
end = time.time() + 10
pipe = conn.pipeline()


while time.time() < end:
    try:
        pipe.watch("market:", buyer)                #A
        price = pipe.zscore("market:", item)        #B
        funds = int(pipe.hget(buyer, "funds"))      #B
        if price != lprice or price > funds:        #B
            pipe.unwatch()                          #B
            return None


        pipe.multi()                                #C
        pipe.hincrby(seller, "funds", int(price))   #C
        pipe.hincrby(buyer, "funds", int(-price))   #C
        pipe.sadd(inventory, itemid)                #C
        pipe.zrem("market:", item)                  #C
        pipe.execute()                              #C
        return True
    except redis.exceptions.WatchError:             #D
        pass                                        #D


return False

正如你所看到的,这个例子使用了流水线,据我所知,在调用 pipe.execute() 之前不会执行命令。在此示例中,您在 #B 处看到一个 if 语句,但此处是否返回了价格值?或者是在调用 conn.pipeline() 时以某种方式缓冲了代码执行。

最佳答案

我假设您正在使用 redis-py 库。当您调用 pipe.watch() 时,管道将立即进入执行模式。因此,您可以使用常规的 Python 代码来检查后续命令的返回值。您可以使用 pipe.multi() 再次将管道置于缓冲模式,这正是代码正在执行的操作。最后一个 pipe.execute() 仅用于执行代码中标记为“#C”的命令。所有这些都在 redis-py docs 中进行了解释。总结一下:

pipe.watch(...) # <--- executed immediately
pipe.zscore(...) # <--- executed immediately
.....
pipe.multi() # <--- put pipeline back in *buffered* mode
pipe.incr(..) # <--- buffered command 1
pipe.incr(..) # <--- buffered command 2
pipe.execute() # <--- execute buffered commands 1 and 2

关于python - Redis 在行动示例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22878912/

10-16 20:08