天天看點

redis事務與樂觀鎖

文章目錄

    • 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的操作

redis事務與樂觀鎖
redis事務與樂觀鎖

unwatch:取消所有key的監控