Redis基礎之事務

若是Redis須要執行一組命令,爲了保持數據的一致性,連續性,須要用到事務(Transaction),本文以一些簡單的小例子,簡述Redis事務相關內容,僅供學習分享使用,若有不足之處,還請指正。redis

Redis事務涉及命令

  • DISCARD:取消事務,且DISCARD是與MULTI成對出現,不能夠單獨使用。
  • MULTI:標記一個事務塊的開始。
  • EXEC:順序執行全部事務內的命令。
  • WATCH:監視一個或多個key。
  • UNWATCH:取消監視。

 

事務基本操做

基本事務以MULTI開始,以EXEC結束,中間是一組Redis命令,以下所示:數據庫

 1 127.0.0.1:6379> MULTI
 2 OK
 3 127.0.0.1:6379> SET NAME HSIANG
 4 QUEUED
 5 127.0.0.1:6379> SET AGE 20
 6 QUEUED
 7 127.0.0.1:6379> SET SEX MALE
 8 QUEUED
 9 127.0.0.1:6379> SET ADDR SHENZHEN
10 QUEUED
11 127.0.0.1:6379> EXEC
12 1) OK
13 2) OK
14 3) OK
15 4) OK
16 127.0.0.1:6379> 

 

取消事務

取消事務,則恢復數據到事務執行以前的狀態,以MULTI開始,以DISCARD結尾,以下所示:學習

 1 127.0.0.1:6379> GET AGE
 2 "20"
 3 127.0.0.1:6379> MULTI
 4 OK
 5 127.0.0.1:6379> INCR AGE
 6 QUEUED
 7 127.0.0.1:6379> INCR AGE
 8 QUEUED
 9 127.0.0.1:6379> INCR AGE
10 QUEUED
11 127.0.0.1:6379> DISCARD
12 OK
13 127.0.0.1:6379> GET AGE
14 "20"

 

事務部分執行

Redis事務中,若是要執行的一組命令中,沒有語法錯誤,可是有數據類型錯誤,在進行EXEC的時候,則其餘命令執行成功,錯誤數據執行失敗,即爲部分紅功。以下所示:spa

 1 127.0.0.1:6379> MULTI
 2 OK
 3 127.0.0.1:6379> INCR AGE
 4 QUEUED
 5 127.0.0.1:6379> INCR ADDR
 6 QUEUED
 7 127.0.0.1:6379> INCR AGE
 8 QUEUED
 9 127.0.0.1:6379> EXEC
10 1) (integer) 21
11 2) (error) ERR value is not an integer or out of range
12 3) (integer) 22
13 127.0.0.1:6379> GET AGE
14 "22"

 

事務終止

若是要執行的Redis命令,存在語法錯誤,則在進行EXEC的時候回滾,以下所示:code

 1 127.0.0.1:6379> MULTI
 2 OK
 3 127.0.0.1:6379> INCR AGE
 4 QUEUED
 5 127.0.0.1:6379> SET ADDR
 6 (error) ERR wrong number of arguments for 'set' command
 7 127.0.0.1:6379> INCR AGE
 8 QUEUED
 9 127.0.0.1:6379> EXEC
10 (error) EXECABORT Transaction discarded because of previous errors.
11 127.0.0.1:6379> GET AGE
12 "22"

Redis鎖

鎖分爲樂觀鎖,悲觀鎖,如下分別介紹:blog

  • 悲觀鎖(Pessimistic Lock):正如其名,具備強烈的獨佔和排他特性。它指的是對數據被外界(包括本系統當前的其餘事務,以及來自外部系統的事務處理)修改持保守態度。
  • 樂觀鎖(Optimistic Locking):是相對悲觀鎖而言的,樂觀鎖假設數據通常狀況下不會形成衝突,因此在數據進行提交更新的時候,纔會正式對數據的衝突與否進行檢測,若是發現衝突了,則返回給用戶錯誤的信息,讓用戶決定如何去作。樂觀鎖適用於讀操做多的場景,這樣能夠提升程序的吞吐量。

WATCH監控

當監控的key的值在事務以前發生變化了,則事務不被執行。只有取消監控後,事務纔會執行,以下所示:隊列

 1 127.0.0.1:6379> WATCH balance
 2 OK
 3 127.0.0.1:6379> set balance 300
 4 OK
 5 127.0.0.1:6379> MULTI
 6 OK
 7 127.0.0.1:6379> INCRBY balance 10
 8 QUEUED
 9 127.0.0.1:6379> DECRBY debt 10
10 QUEUED
11 127.0.0.1:6379> EXEC
12 (nil)
13 127.0.0.1:6379> GET balance
14 "300"
15 127.0.0.1:6379> UNWATCH
16 OK

Redis事務的特性

  1. 單獨的隔離操做:事務中的全部命令,都會被序列化,按順序執行。事務在執行過程當中,不會被其餘的命令請求中斷。
  2. 沒有隔離級別的概念:隊列中的命令,沒有提交以前,都沒有實際的被執行,也就不存在事務內查看事務內的更新。
  3. 不保證原子性:redis同一事務中,若是有某一條命令執行失敗,則其餘命令會被執行,不會回滾(與關係型數據庫不一樣)。

備註

早發白帝城事務

做者:李白(唐代)ci

朝辭白帝彩雲間,千里江陵一日還。io

兩岸猿聲啼不住,輕舟已過萬重山。

相關文章
相關標籤/搜索