Redis基礎 五 Redis事務 樂觀鎖

2021-10-11 02:14:49 字數 3562 閱讀 1066

redis 事務可以一次執行多個命令, 並且帶有以下三個重要的保證:

乙個事務從開始到執行會經歷以下三個階段:

我們可以理解redis事物為乙個指令碼,指令碼中如果出現編譯時錯誤(**有錯),整條指令碼都不會被執行,並且並拋棄。指令碼中如果出現執行時錯誤(1/0等邏輯錯誤),除了該條指令其他的語句依然會被執行。

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>

exec

#執行事務

1) ok

2) ok

3) ok

127.0.0.1:6379> get k1 #可以拿到

"v1"

127.0.0.1:6379> get k3

"v3"

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 k4 v4

queued

127.0.0.1:6379> se k5 v5

(error) err unknown command

`se`

, with args beginning with: `k5`

, `v5`

, #語法錯誤

127.0.0.1:6379>

set k6 v6

queued

127.0.0.1:6379>

exec

#執行(error) execabort transaction discarded because of previous errors. #所有事務都不會執行

127.0.0.1:6379> get k6 #拿不到

(nil)

127.0.0.1:6379> multi #開啟事務

ok 127.0.0.1:6379>

set k7 v7

queued

127.0.0.1:6379> incr k7 #對字串進行增加一操作(邏輯錯誤)

queued

127.0.0.1:6379>

set k8 v8

queued

127.0.0.1:6379>

exec

#其他的會被執行

1) ok

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

3) ok

127.0.0.1:6379> get k8

"v8"

悲觀鎖:

樂觀鎖:

我們在redis中可以通過watch來實現對乙個物件的樂觀鎖,通過watch來獲取乙個屬性的version。

下面是具體事例:

127.0.0.1:6379>

set money 100

ok127.0.0.1:6379>

set out 0

ok127.0.0.1:6379>

watch money

ok127.0.0.1:6379> multi

ok127.0.0.1:6379> decrby money

(error) err wrong number of arguments for

'decrby'

command

127.0.0.1:6379> discard

ok127.0.0.1:6379>

watch money #監控money的值

ok127.0.0.1:6379> multi #開啟事務

ok127.0.0.1:6379> decrby money 30 #減少餘額30

queued

127.0.0.1:6379> incrby out 20 #增加支出20

queued

127.0.0.1:6379>

exec

#執行1)

(integer) 70

2)(integer) 20

127.0.0.1:6379>

watch money #先檢視下money

ok127.0.0.1:6379> multi #開啟一下

ok127.0.0.1:6379> incrby money 50

queued

這時我們不提交事務,我們模擬一下另外乙個執行緒對money進行改變的場景,這裡第二個執行緒將這個錢數減少了20

127.0.0.1:6379> get money

"70"

127.0.0.1:6379> decrby money 50

(integer) 20

再執行下第乙個執行緒的事務

127.0.0.1:6379> get money

queued

127.0.0.1:6379>

exec

(nil)

這裡執行出現nil,這就代表著樂觀鎖生效了,事務沒有執行成功。

那假如我們在第二個執行緒也對money做了一些改變,但是最終值與原來第乙個執行緒watch時的值相同呢?

第乙個執行緒,

127.0.0.1:6379>

set jj 80

ok127.0.0.1:6379>

watch jj #加鎖

ok127.0.0.1:6379> multi

ok127.0.0.1:6379> incrby jj 30 #這裡第二個執行緒先對他增加50,再減少50

queued

127.0.0.1:6379>

exec

#執行(nil)

發現不大行,redis的事務處理與其值沒有很大的關係。

Redis基礎學習(五) Redis中的事務

redis的單條命令保證原子性,事務不保證原子性!事物的本質 一組命令的集合,乙個事務中所有的命令都會被序列化,在事務執行的過程中,會按照順序進行執行!事務的特性 一次性 單次 順序性 有順序 排他性 排除干擾 redis的事務沒有隔離級別的概念!所有的命令都在事務中,並沒有被立刻執行,只有在發起執...

五 Redis入門事務

是什麼 可以一次執行多個命令,本質是一組命令的集合。乙個事務中的 所有命令都會序列化,按順序地序列化執行而不會被其它命令插入,不許加塞 能幹嘛 乙個佇列中,一次性 順序性 排他性的執行一系列命令 怎麼玩 case1正常執行 開啟 multi 執行一堆,例如set k1 v1 set k2 v2 提交...

Redis筆記 五 之事務

redis 事務本質 一組命令的集合!乙個事務中的所有命令都會被序列化,在事務執行過程的中,會按 照順序執行!一次性 順序性 排他性!執行一些列的命令!佇列 set set set 執行 redis事務沒有沒有隔離級別的概念!所有的命令在事務中,並沒有直接被執行!只有發起執行命令的時候才會執行!ex...