从我正在阅读的"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()时,代码exectution以某种方式缓冲.
我假设你正在使用redis-py
图书馆.当您调用时pipe.watch()
,管道将立即进入执行模式.因此,您可以使用常规python代码来检查后续命令的返回值.您可以再次使用管道处于缓冲模式,pipe.multi()
这正是代码正在执行的操作.最后一个pipe.execute()
只是在代码中执行标记为"#C"的命令.所有这些都在redis-py文档中进行了解释.总结一下:
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