当前位置:  开发笔记 > 编程语言 > 正文

Redis在动作示例中

如何解决《Redis在动作示例中》经验,为你挑选了1个好方法。

从我正在阅读的"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以某种方式缓冲.



1> spinlok..:

我假设你正在使用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

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有