Redis筆記 五 之事務

2021-10-11 22:52:41 字數 4153 閱讀 7078

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注意 加入事務的命令暫時進入到任務佇列中,並沒有...