1. 程式人生 > 實用技巧 >Redis的事務

Redis的事務

1. 事務

事物本質: 一組命令的集合! 一個事務中的所有命令都會被序列化 在事務執行的過程中, 會按照順序執行

一次性, 順序性,排他性

-------- 佇列 set  set set 執行 -------
Redis 事務沒有隔離級別的概念

所有命令在事務中,並沒有直接被執行 只有發起執行命令的時候才會執行

  • Redis 單條命令是儲存原子性的,但是事務不保證原子性

    reddis的事務:

    • 開啟事務 ()

    • 命令入隊 ()

    • 執行事務 ()

    正常執行事務

    • multi 開起事務

    • set k1 v1

    • set k2 v2

    • exec // (執行)

    事物的放棄

    • multi

    • set k1 v1

    • set k2 v2

    • set k3 v2

    • discard (取消事務)

    編譯時異常

    • multi

    • set k1 v1

    • adfba fab (錯誤的命令)

    • set k3 v3

    • exec

      事務中有報錯的 所有值都不會執行

    執行時異常

    • multi

    • set k1 'fasdfa'

    • incr k1

    • set k2 v2

    • get k3

    • exec

      incr k1 這個不能對字串加減報錯 這樣其他的依就可以正常執行 所以Redis中的事務不保證原子性

監控

悲觀鎖:

  • 很悲觀, 認為什麼時候都會出問題,無論做什麼都會加鎖

樂觀鎖

  • 很樂觀,認為什麼時候都不會出問題,所以不會上鎖! 更新資料的時候去判斷

  • 獲取version

  • 提交的時候比較version

redis 實現樂觀鎖(原理 先獲取 他的值 在提交的時候在對比下開媽獲取的值如果沒有發生變化就會執行成功)

127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
127.0.0.1:6379> watch money # 監視money 物件
OK
127.0.0.1:6379> multi 事務正常結束, 資料期間沒有發生變動
OK
127.0.0.1:6379> decrby money 20
QUEUED
127.0.0.1:6379> incrby out 20
QUEUED
127.0.0.1:6379> exec
1) (integer) 80
2) (integer) 20 執行成功返回
127.0.0.1:6379>
127.0.0.1:6379> watch money  # 
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 10
QUEUED
127.0.0.1:6379> incrby out 10
QUEUED
127.0.0.1:6379> exec 執行exec 前 開啟個別一個連線 執行 set money 1000 然後在來執行exec
(nil) 執行失敗 (如果執行失敗放棄監視)
127.0.0.1:6379> unwatch
OK
127.0.0.1:6379> watch money # 重新監視
OK
127.0.0.1:6379> multi 開起事務
OK
127.0.0.1:6379> decrby money 10
QUEUED
127.0.0.1:6379> incrby out 10
QUEUED
127.0.0.1:6379> exec
1) (integer) 990
2) (integer) 30
127.0.0.1:6379>