文章目錄
-
- redis事務的特性
- 事務的基本操作
- 舉例證明redis的事務泛原子性
- watch及樂觀鎖的操作
redis事務的特性
redis事務的本質其實就是一組redis指令的集合,其特點如下
- redis事務是一個泛原子操作(ps:某些情況redis的事務不是原子性的,比如多條指令中有一條指令屬于運作時異常,那麼該異常不會影響其他指令的執行)
- redis事務沒有隔離級别的概念,因為redis是單線程的,每個事務都是一個單獨的隔離操作:事務中的所有指令都會序列化、按順序地執行。事務在執行的過程中,不會被其他用戶端發送來的指令請求所打斷
- redis中的單條指令存在原子性
-
redis中的事務為間接執行,執行過程
multi:事務開啟,标記下面輸入的redis指令會按順序加入到可執行隊列中。
…:入隊列的指令
exec :事務執行,
discard:放棄該事務
事務的基本操作
127.0.0.1:6379> multi --開啟事務
OK
127.0.0.1:6379(TX)> set k1 v1 --添加執行指令進入隊列
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> exec --執行事務
1) OK
2) OK
3) OK
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
#########################################################
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k4 v
QUEUED
127.0.0.1:6379(TX)> set k5 v5
QUEUED
127.0.0.1:6379(TX)> set k6 v6
QUEUED
127.0.0.1:6379(TX)> discard --執行事務
OK
127.0.0.1:6379> get k5 --可以看到,事務并沒有執行
(nil)
127.0.0.1:6379> get k6
(nil)
舉例證明redis的事務泛原子性
###############################運作時異常
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k7 str
QUEUED
127.0.0.1:6379(TX)> incr k7 --字元串不可以進行自增操作,屬于運作時異常
QUEUED
127.0.0.1:6379(TX)> set k8 1
QUEUED
127.0.0.1:6379(TX)> incr k8
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) (error) ERR value is not an integer or out of range --可以看到第二條指令報錯
3) OK
4) (integer) 2
127.0.0.1:6379> mget k7 k8 --可以看到,雖然第二條指令報錯了,但沒有影響其它的指令
1) "str"
2) "2"
127.0.0.1:6379>
########################################################
--編譯時異常
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> sett k9 1 --添加無法編譯的指令,會直接報錯
(error) ERR unknown command `sett`, with args beginning with: `k9`, `1`,
127.0.0.1:6379(TX)> set k10 1
QUEUED
127.0.0.1:6379(TX)> set k11 1
QUEUED
127.0.0.1:6379(TX)> exec --由于事務中存在編譯時異常,是以整個事務不執行
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> mget k10 k11 --可以看到事務并沒有執行
1) (nil)
2) (nil)
watch及樂觀鎖的操作
watch用于監聽一個對象是否改變,常與事務配合使用,以便達到樂觀鎖的作用。
-
樂觀鎖:認為任何情況下都不會出現并發問題,是以在操作的時候不增加鎖,隻有在任務具體執行的寫操作時候,才會與需要改變的資料進行version對比,如果一緻任務才會執行成功。
(ps:原理在建立任務的時候會記錄目前需要被改變對象的version,而任何時候隻要對象被改變那麼該對象的version也會改變)
- 悲觀鎖:認為任何情況下都會出現并發問題,是以在操作的時候都會增加鎖,來保證資料的準确性。(ps:效率較低)
代碼驗證
執行exec之前先執行了,改變money的操作
unwatch:取消所有key的監控