python學習筆記4-redis multi watch實現鎖庫存,python4-redis

來源:互聯網
上載者:User

python學習筆記4-redis multi watch實現鎖庫存,python4-redis

  python 關於redis的基本操作網上已經很多了,這裡主要介紹點個人覺得有意思的內容1.redis的事務操作以及watch 樂觀鎖;後面描述2.tornado下非同步使用redis的方式       redis是單進程單執行緒模式,本身應對外部請求的是單任務的,也是多安全執行緒的,這個大家都應該知道的, 所以才會經常有人用redis做計數服務。       首先redis 的交易處理只能使用pipeline:In redis-py MULTI and EXEC can only be used through a Pipeline object.http://stackoverflow.com/questions/31769163/what-are-equivalent-functions-of-multi-and-exec-commands-in-redis-py     很多人喜歡在處理電商庫存,例如秒殺活動的時候用redis做計數器,不過下面這段代碼採用了事務來控制庫存,是不是有點問題呢?
if __name__ == "__main__":    with sms_redis.pipeline() as pipe:        while 1:            try:                # 事務開始                pipe.multi()                count = int(sms_redis.get('stock_count'))                if count > 0:  # 有庫存                    pipe.set('stock_count', count - 1)                # 事務結束                pipe.execute()                # 把命令推送過去                break            except Exception:                traceback.print_exc()                continue
  問題在於誤以為pipe.multi() 交易處理執行後,就可以鎖住該庫存,這裡強調下:redis 本身沒有悲觀鎖的概念,也就是說對於客戶的是無法鎖住redis中的值的,當然你可以通過其它曲徑實現,比如SETNX, 這裡先不談;redis 的事務可以認為是一段命令的批量執行和執行結果一次性返還,事務操作本身沒有問題,執行過程不會中斷, 但是在pipe.execute() 的時候事務才真正向redis_server 提交,但是很遺憾在redis_server 執行之前庫存都有機會被其它用戶端修改,完全起不到鎖庫存概念;   那麼如何才能實現鎖庫存呢?watch是一個很好的解決方案:  watch 字面就是監視的意思,這裡可以看做為資料庫中樂觀鎖的概念,誰都可以讀,誰都可以修改,但是修改的人必須保證自己watch的資料沒有被別人修改過,否則就修改失敗了; 
if __name__ == "__main__":    with sms_redis.pipeline() as pipe:        while 1:            try:                #關注一個key                pipe.watch('stock_count’)                count = int(pipe.get('stock_count'))                if count > 0:  # 有庫存                    # 事務開始                    pipe.multi()                    pipe.set('stock_count', count - 1)                    # 事務結束                    pipe.execute()                    # 把命令推送過去                break            except Exception:                traceback.print_exc()                continue
  如果在watch後值被修改,在執行pipe.execute()的時候會報異常WatchError: Watched variable changed.這裡可以簡單的實現基於redis中的鎖庫存的邏輯。    

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.