大資料求索(15): Redis事務詳解
阿新 • • 發佈:2019-01-07
大資料求索(15): Redis事務詳解
一、什麼是事務
- 事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序執行。事務在執行的過程中,不會被其他客戶端傳送來的命令請求打斷。
- 事務是一個原子操作:事務中的命令要麼全部被執行,要麼全部都不執行。
二、Redis中的事務
2.1 常用命令
MULTI、EXEC、DISCARD和WATCH是Redis事務相關的命令。
- MULTI:標記一個事務塊的開始
- EXEC:執行所有事務塊內的命令
- DISCARD:取消事務,放棄執行事務塊內的所有命令
- WATCH:監視一個或多個key,如果在事務執行之前這些key被其他命令所改動,那麼事務將被打斷。
- UNWATCH:取消watch命令對所有key的監視
2.2 使用例項
正常執行
放棄事務
全體連坐
即,一個顯式錯誤,全部受牽連,都不執行
冤頭債主
即對的執行,錯的丟擲錯誤
三、Watch用法
3.1 樂觀鎖和悲觀鎖
悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。
傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。
樂觀鎖(Optimistic Lock), 顧名思義,就是很樂觀,每次去拿資料的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個資料,可以使用版本號等機制。
多讀
的應用型別,這樣可以提高吞吐量。
在redis裡,樂觀鎖策略:提交版本必須 大於
記錄當前版本才能執行更新。
3.2 watch命令
Watch指令,類似樂觀鎖,事務提交時,如果Key的值已被別的客戶端改變,
比如某個list已被別的客戶端push/pop過了,整個事務佇列都不會被執行。
通過WATCH命令在事務執行之前監控了多個Keys,倘若在WATCH之後有任何Key的值發生了變化,EXEC命令執行的事務都將被放棄,同時返回Nullmulti-bulk應答以通知呼叫者事務執行失敗。如下圖所示
在第一張圖執行事務期間,第二張圖表示新建了另一個連線客戶端,並對balance進行了修改。此時,第一張圖中watch
nil
。
注意:
一旦exec了,watch加的監控鎖都會自動取消。
當然,也可以使用unwatch手動取消。這裡就不演示了。