1.簡(jiǎn)述
Redis事務(wù)是一個(gè)單獨(dú)的隔離操作:事務(wù)中的所有命令都會(huì)序列化、按順序地執(zhí)行
兰迫。事務(wù)在執(zhí)行的過(guò)程中匹耕,不會(huì)被其他客戶端發(fā)送來(lái)的命令請(qǐng)求所打斷责掏;Redis事務(wù)的主要作用就是串聯(lián)多個(gè)命令防止別的命令插隊(duì)
。
總結(jié)說(shuō):redis事務(wù)就是一次性轩拨、順序性践瓷、排他性的執(zhí)行一個(gè)隊(duì)列中的一系列命令。
2.Multi亡蓉、Exec晕翠、Discard指令
從輸入 Multi
命令開(kāi)始,輸入的命令都會(huì)依次進(jìn)入命令隊(duì)列中砍濒,但不會(huì)執(zhí)行淋肾,直到輸入Exec
后,Redis會(huì)將之前的命令隊(duì)列中的命令依次執(zhí)行爸邢。組隊(duì)的過(guò)程中可以通過(guò)discard
來(lái)放棄組隊(duì)樊卓。
(1)正常事務(wù)執(zhí)行
(2)放棄事務(wù)執(zhí)行
(3)若在事務(wù)隊(duì)列中存在命令性錯(cuò)誤(類似于java編譯性錯(cuò)誤),則執(zhí)行EXEC命令時(shí)杠河,所有命令都不會(huì)執(zhí)行
(4)若在事務(wù)隊(duì)列中存在語(yǔ)法性錯(cuò)誤(類似于java的1/0的運(yùn)行時(shí)異常)简识,則執(zhí)行EXEC命令時(shí),其他正確命令會(huì)被執(zhí)行感猛,錯(cuò)誤命令拋出異常七扰。
3.悲觀鎖
悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀陪白,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人會(huì)修改颈走,所以每次在拿數(shù)據(jù)的時(shí)候都會(huì)上鎖,這樣別人想拿這個(gè)數(shù)據(jù)就會(huì)block直到它拿到鎖咱士。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)里邊就用到了很多這種鎖機(jī)制立由,比如行鎖,表鎖等序厉,讀鎖锐膜,寫鎖
等,都是在做操作之前先上鎖弛房。
4.樂(lè)觀鎖
樂(lè)觀鎖(Optimistic Lock), 顧名思義道盏,就是很樂(lè)觀,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會(huì)修改,所以不會(huì)上鎖荷逞,但是在更新的時(shí)候會(huì)判斷一下在此期間別人有沒(méi)有去更新這個(gè)數(shù)據(jù)媒咳,可以使用版本號(hào)等機(jī)制
。樂(lè)觀鎖適用于多讀的應(yīng)用類型种远,這樣可以提高吞吐量
涩澡。Redis就是利用這種check-and-set
機(jī)制實(shí)現(xiàn)事務(wù)的。
5.使用watch
在執(zhí)行multi
之前坠敷,先執(zhí)行watch key1 [key...]
,可以監(jiān)視一個(gè)(或多個(gè)) key 妙同,如果在事務(wù)執(zhí)行之前這個(gè)(或這些) key 被其他命令所改動(dòng),那么事務(wù)將被打斷膝迎。
驗(yàn)證:首先開(kāi)啟兩個(gè)redis客戶端渐溶,客戶端1和客戶端2
客戶端1,注意此時(shí)先不要exec執(zhí)行
127.0.0.1:6379> set number 10
OK
127.0.0.1:6379> watch number
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set number 100
QUEUED
127.0.0.1:6379(TX)> get number
QUEUED
127.0.0.1:6379>
客戶端2
127.0.0.1:6379> set number 500
OK
客戶端1
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get number
"500"
發(fā)現(xiàn)為nil,執(zhí)行未成功弄抬,獲取的值為客戶端2修改后的值茎辐。
6.unwatch
取消 WATCH
命令對(duì)所有 key 的監(jiān)視,如果在執(zhí)行WATCH
命令之后掂恕,EXEC
命令或DISCARD
命令先被執(zhí)行了的話拖陆,那么就不需要再執(zhí)行UNWATCH
了。
7.Redis事務(wù)三特性
- 單獨(dú)的隔離操作
- 事務(wù)中的所有命令都會(huì)序列化懊亡、按順序地執(zhí)行依啰。事務(wù)在執(zhí)行的過(guò)程中,不會(huì)被其他客戶端發(fā)送來(lái)的命令請(qǐng)求所打斷店枣。
- 沒(méi)有隔離級(jí)別的概念
- 隊(duì)列中的命令沒(méi)有提交之前都不會(huì)實(shí)際被執(zhí)行速警,因?yàn)槭聞?wù)提交前任何指令都不會(huì)被實(shí)際執(zhí)行
- 不保證原子性
- 事務(wù)中如果有一條命令執(zhí)行失敗,其后的命令仍然會(huì)被執(zhí)行鸯两,沒(méi)有回滾