如果Redis需要執行一組命令,為了保持資料的一致性,連續性,需要用到事務(Transaction),本文以一些簡單的小例子,簡述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的時候,則其他命令執行成功,錯誤資料執行失敗,即為部分成功,如下所示:
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的時候回滾,如下所示:
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鎖
鎖分為樂觀鎖,悲觀鎖,以下分別介紹:
- 悲觀鎖(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事務的特性
- 單獨的隔離操作:事務中的所有命令,都會被序列化,按順序執行,事務在執行程序中,不會被其他的命令請求中斷,
- 沒有隔離級別的概念:佇列中的命令,沒有提交之前,都沒有實際的被執行,也就不存在事務內查看事務內的更新,
- 不保證原子性:redis同一事務中,如果有某一條命令執行失敗,則其他命令會被執行,不會回滾(與關系型資料庫不同),
備注
早發白帝城
作者:李白(唐代)
朝辭白帝彩云間,千里江陵一榷訓,
兩岸猿聲啼不住,輕舟已過萬重山,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/251629.html
標籤:NoSQL
上一篇:深入理解Redis之簡單動態字串
