redis 事務本質:一組命令的集合! 乙個事務中的所有命令都會被序列化,在事務執行過程的中,會按
照順序執行!
一次性、順序性、排他性!執行一些列的命令!
------ 佇列 set set set 執行------
redis事務沒有沒有隔離級別的概念!
所有的命令在事務中,並沒有直接被執行!只有發起執行命令的時候才會執行!exec
redis單條命令式儲存原子性的,但是事務不保證原子性!
redis的事務:
開啟事務(multi)
命令入隊(…)
執行事務(exec)
正常執行事務
127.0.0.1:6379> multi # 開啟事務
ok# 命令入隊
127.0.0.1:6379>
set k1 v1
queued
127.0.0.1:6379>
set k2 v2
queued
127.0.0.1:6379> get k2
queued
127.0.0.1:6379>
set k3 v3
queued
127.0.0.1:6379>
exec
# 執行事務
1) ok
2) ok
3)"v2"
4) ok
放棄事務
127.0.0.1:6379> multi # 開啟事務
ok127.0.0.1:6379>
set k1 v1
queued
127.0.0.1:6379>
set k2 v2
queued
127.0.0.1:6379>
set k4 v4
queued
127.0.0.1:6379> discard # 取消事務
ok127.0.0.1:6379> get k4 # 事務佇列中命令都不會被執行!
(nil)
編譯型異常(**有問題! 命令有錯!) ,事務中所有的命令都不會被執行!
127.0.0.1:6379> multi
ok127.0.0.1:6379>
set k1 v1
queued
127.0.0.1:6379>
set k2 v2
queued
127.0.0.1:6379>
set k3 v3
queued
127.0.0.1:6379> getset k3 # 錯誤的命令
(error) err wrong number of arguments for
'getset'
command
127.0.0.1:6379>
set k4 v4
queued
127.0.0.1:6379>
set k5 v5
queued
127.0.0.1:6379>
exec
# 執行事務報錯!
(error) execabort transaction discarded because of previous errors.
127.0.0.1:6379> get k5 # 所有的命令都不會被執行!
(nil)
執行時異常(1/0), 如果事務佇列中存在語法性,那麼執行命令的時候,其他命令是可以正常執行的,錯誤命令丟擲異常!
127.0.0.1:6379>
set k1 v1
queued
127.0.0.1:6379> discard
ok127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379>
set k1 v1
ok127.0.0.1:6379> multi
ok127.0.0.1:6379> incr k1 # 會執行的時候失敗!
queued
127.0.0.1:6379>
set k2 v2
queued
127.0.0.1:6379>
set k3 v3
queued
127.0.0.1:6379> get k3
queued
127.0.0.1:6379>
exec
# 雖然第一條命令報錯了,但是依舊正常執行成功了!
1)(error) err value is not an integer or out of range
2) ok
3) ok
4)"v3"
監控:watch (面試常問!)redis中watch可以當成樂觀鎖來操作
悲觀鎖:
樂觀鎖:
redis測監視測試正常執行成功!
127.0.0.1:6379>
set money 100
ok127.0.0.1:6379>
set out 0
ok127.0.0.1:6379>
watch money # 監視 money 物件
ok127.0.0.1:6379> multi # 事務正常結束,資料期間沒有發生變動,這個時候就正常執行成功!
ok127.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
測試多執行緒修改值 , 使用watch 可以當做redis的樂觀鎖操作!
#開啟新的客戶端
[root@zhaohziyue ~]
# cd /usr/local/bin
[root@zhaohziyue bin]
# redis-cli -p 6379
127.0.0.1:6379>
ping
pong
127.0.0.1:6379> keys *
1)"money"
2)"out"
#在舊的客戶端中開啟事務
127.0.0.1:6379>
watch money # 監視 money
ok127.0.0.1:6379> multi
ok127.0.0.1:6379> decrby money 10
queued
127.0.0.1:6379> incrby out 10 #在另乙個執行緒中設定 set money 1000
queued
127.0.0.1:6379>
exec
# 執行之前,另外乙個執行緒,修改了我們的值,這個時候,就會導致事務執行失
敗!(nil)
如果修改失敗,獲取最新的值就好
127.0.0.1:6379> unwatch #1,發現事務執行失敗,就先解鎖
ok127.0.0.1:6379>
watch money#2,獲取最新的值,再次監視
ok127.0.0.1:6379> multi
ok127.0.0.1:6379> decrby money 1
queued
127.0.0.1:6379> incrby out 1
queued
127.0.0.1:6379>
exec
#3,對比監視的值是否發生了變化,如果沒變化,就可以執行成功,如果變了就執行失敗
1)(integer) 999
2)(integer) 21
Redis之事務案例
一次執行多個命令,本質是一組命令的集合。乙個事務中的所有命令都會序列化,按順序地序列化執行而不會被其它命令插入,不許加塞。乙個佇列中,一次性 順序性 排他性的執行一系列命令。單獨的隔離操作 事務中的所有命令都會序列化 按順序地執行。事務在執行的過程中,不會被其他客戶端傳送來的命令請求所打斷 沒有隔離...
redis高階之事務
事務簡介 超市的收銀員在盤賬,一天下來收了一些零錢,然後乙個乙個數,在數的過程中來了乙個兒童,這個兒童唱了一首歌 門前大橋下游過一群鴨,快來快來數一數二十六七八。然後這個收銀員一臉難色地把數好的錢又放了回去。這裡收銀員在做連續的動作 數錢 時被打斷了,或者被影響到了,那麼數錢的結果肯定是不正確的。怎...
Redis高階 之 事務
redis事務就是乙個命令執行的佇列,將一系列預定義命令包裝成乙個整體 乙個佇列 當執行時,一次性按照新增順序依次執行,中間不會被打斷或者干擾.乙個佇列中,一次性 順序性 排他性的執行一系列命令 1.事務的基本操作 定義,執行,取消 multiexec注意 加入事務的命令暫時進入到任務佇列中,並沒有...