Redis的事務講解

1. Redis事務的概念

是什麼: 能夠一次執行多個命令,本質是一組命令的集合。一個事務中的全部命令都會序列化,按順序串行化的執行而不會被其餘命令插入redis

能幹嗎:一個隊列中,一次性、順序性、排他性的執行一系列命令 (要和pipeline區分開)數據庫

Redis實際上是部分支持事務: 由於事務的錯誤模式並不統一3d

 

2. 使用方法

1. 經常使用命令

 

2. 正常開啓Redis事務

 

3. 放棄事務

 

4. 事務的錯誤模式(一): '全體連坐'

 

5.事務的錯誤模式(二): '冤頭債主'

 

6. watch 監控

悲觀鎖:顧名思義很悲觀,每次去拿數據的時候都認爲別人修改,因此每次在拿數據的時候都會上鎖,這樣若是中間有人想拿數據就會一直阻塞除非鎖被釋放獲取到鎖。傳統的關係型數據庫裏,用到了不少種這種鎖機制,好比行鎖,表鎖,寫鎖等blog

樂觀鎖:顧名思義很樂觀,每次去拿數據的時候都認爲別人不會修改,因此不會上鎖,可是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可使用版本號等機制。樂觀鎖適用於多讀的應用類型,這樣能夠提升吞吐量隊列

示例:事務

  • 1.初始化信用卡可用餘額和欠額:

  • 2.用watch監控,進行數據監控:
    ip

  • 3.監控過程當中,他人纂改:
    pip

一旦EXEC命令執行,以前加的監控鎖就會取消監控

Watch指令,相似樂觀鎖,事務提交時,若是Key的值已被別的客戶端改變,序列化

好比某個list已被別的客戶端push/pop過了,整個事務隊列都不會被執行

 

3.小結

1. 事務3階段

  • 開啓:以MULTI 開啓一個事務
  • 入隊:將多個命令入隊到事務中,接到這些命令不會當即執行,而是放到等待執行的事務隊列裏面
  • 執行:由EXEC命令觸發事務

 

2.事務3特性

  • 單獨的隔離操做:事務中的全部命令都會序列化、按順序地執行。事務在執行的過程當中,不會被其餘客戶端發送來的命令請求所打斷。
  • 沒有隔離級別的概念:隊列中的命令沒有提交以前都不會實際的被執行,由於事務提交前任何指令都不會被實際執行,也就不存在」事務內的查詢要看到事務裏的更新,在事務外查詢不能看到」這個讓人萬分頭痛的問題
  • 不保證原子性:redis同一個事務中若是有一條命令執行失敗,其後的命令仍然會被執行,沒有回滾
相關文章
相關標籤/搜索