1. 程式人生 > >大資料求索(15): Redis事務詳解

大資料求索(15): Redis事務詳解

大資料求索(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

了balance這個key,監控到了變化,所以整個事務沒有正確執行,返回了一個nil

注意:

一旦exec了,watch加的監控鎖都會自動取消。

當然,也可以使用unwatch手動取消。這裡就不演示了。