Redis事務 樂觀鎖和悲觀鎖詳細介紹

2021-10-11 03:32:22 字數 3186 閱讀 5200

mysql:acid。要麼同時成功,要麼同時失敗。

redis事務本質:一組命令的集合。乙個事務中的所有命令都會被序列化,在事務執行過程中,會按照順序執行。一次性,順序性,排他性,執行一系列的命令。

redis事務沒有隔離級別的概念

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

redis單條命令是保證原子性的,但是事務不保證原子性。(重點)

redis的事務:

正常執行事務

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> get k1 # 命令入隊

queued

127.0.0.1:6379> get k2 # 命令入隊

queued

127.0.0.1:6379> get k9 # 命令入隊

queued

127.0.0.1:6379> setrange k1 0 w # 命令入隊

queued

127.0.0.1:6379>

exec

# 執行事務

1) ok

2) ok

3)"v1"

4)"v2"

5)(nil)

6)(integer) 2

放棄事務 discard

127.0.0.1:6379> multi  # 開啟事務

ok127.0.0.1:6379>

set k4 v4 # 命令入隊

queued

127.0.0.1:6379> discard # 放棄事務

ok127.0.0.1:6379> get k4 # 獲取不到k4的值證明事務沒有執行 事務佇列中命令都不會被執行

(nil)

編譯型異常(**有問題,命令有錯誤),事務中所有的命令都不會被執行。

127.0.0.1:6379> multi

ok127.0.0.1:6379>

set k1 v1

queued

127.0.0.1:6379> getset k1 # 錯誤的命令 getset k1 v1

(error) err wrong number of arguments for

'getset'

command

127.0.0.1:6379>

set k2 v2

queued

127.0.0.1:6379>

exec

# 執行事務

(error) execabort transaction discarded because of previous errors.

127.0.0.1:6379> get k2 # 所有的命令都不會被執行

(nil)

執行時異常(1/0)如果事務佇列中存在一些語法性錯誤,那麼執行命令的時候,其他命令是可以正常執行的,錯誤命令丟擲異常

127.0.0.1:6379>

set k1 "lyt"

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>

exec

# 雖然第一條命令報錯了,但是依舊正常執行成功了

1)(error) err value is not an integer or out of range

2) ok

127.0.0.1:6379> get k2

"v2"

監控 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的樂觀鎖操作

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

queued

127.0.0.1:6379>

exec

# 執行之前,另外乙個執行緒,修改了我們監視的值。這種情況就會導致事務執行失敗

(nil)

如果發現事務執行失敗:

先解鎖(unwatch)

獲取最新的值,再次監視(加鎖)

比對監視的值,是否發生了變化?如果沒有變化,事務可以執行成功,否則,事務執行失敗。再重複上述步驟。

Redis 事務(悲觀鎖 樂觀鎖)

1 定義 redis事務是乙個單獨的隔離操作 事務中所有的命令都會被序列化 按照順序執行 事務在執行過程中不會被其他客戶端傳送來的命令請求打斷 2 作用 串聯多個命令防止別的命令插隊 multi 輸入開始命令 exec 執行命令 discard 放棄組隊 刪除掉 3 注意事項 1 multi 命令不...

Redis09 事務(悲觀鎖 樂觀鎖)

redis事務是乙個單獨的隔離操作 事務中所有的命令都會被序列化 按照順序執行 事務在執行過程中不會被其他客戶端傳送來的命令請求打斷 串聯多個命令防止別的命令插隊 每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖 這樣別人想拿這個資料就會block 阻塞 直到他拿到鎖 傳統的關係型...

Redis鎖,悲觀鎖和樂觀鎖

樂觀鎖開啟事務前,設定對資料的監聽 watch exec時,如果發生資料發生過修改,作用於改資料的事務會自動取消 discard 事務exec後,無論成敗,監聽會被移除 悲觀鎖每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖。場景 如果專案中使用了快取且對快取設定了超時時間。當併發...