您好,登錄后才能下訂單哦!
這篇文章主要介紹了redis事務(wù)有什么用,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
是什么
可以一次執(zhí)行多個(gè)命令,本質(zhì)是一組命令的集合。一個(gè)事務(wù)中的所有命令都會(huì)序列化,按順序地串行化執(zhí)行而不會(huì)被其它命令插入,不許加塞。
一次執(zhí)行多個(gè)redis命令。
能干嘛
一個(gè)隊(duì)列中,一次性、順序性、排他性的執(zhí)行一系列命令。
怎么玩
一個(gè)redis事務(wù)的開啟使用了MULTI命令,這個(gè)命令總是會(huì)回復(fù)OK,(不知道能不能成功),此時(shí)用戶可以一次性執(zhí)行多個(gè)命令而不是一個(gè)一個(gè)的執(zhí)行。redis將它們?nèi)腙?duì),所有命令將會(huì)被EXEC命令調(diào)用
DISCARD放棄批處理操作。
推薦(免費(fèi)):redis教程
常用命令
命令 | 描述 |
---|---|
DISCARD | 取消事務(wù),放棄執(zhí)行事務(wù)塊內(nèi)的所有命令。 |
EXEC | 執(zhí)行所有事務(wù)塊內(nèi)的命令。 |
MULTI | 標(biāo)記一個(gè)事務(wù)塊的開始。 |
UNWATCH | 取消 WATCH 命令對所有 key 的監(jiān)視。 |
WATCH key [key …] | 監(jiān)視一個(gè)(或多個(gè)) key ,如果在事務(wù)執(zhí)行之前這個(gè)(或這些) key 被其他命令所改動(dòng),那么事務(wù)將被打斷。 |
Case
正常執(zhí)行
放棄事務(wù)
全體連坐
一個(gè)錯(cuò)誤,全體連坐,都不執(zhí)行
冤頭債主
對于這個(gè)問題,redis對事務(wù)的支持如何理解
redis對事務(wù)是部分支持,這一部分時(shí),對的執(zhí)行,錯(cuò)的不執(zhí)行
case:watch監(jiān)控
悲觀鎖/樂觀鎖/CAS(Check and set)
悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人會(huì)修改,所以每次在拿數(shù)據(jù)的時(shí)候都會(huì)上鎖,這樣別人想拿這個(gè)數(shù)據(jù)就會(huì)block直到它拿到鎖。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊就用到了很多這種鎖機(jī)制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。
表鎖:對整張表進(jìn)行加鎖。但是這張表可能很多條很多條數(shù)據(jù),這個(gè)時(shí)候一個(gè)進(jìn)程要進(jìn)行大范圍的改動(dòng),會(huì)導(dǎo)致排隊(duì)的線程越來越多。
行鎖:對每一條記錄進(jìn)行加鎖
樂觀鎖
樂觀鎖(Optimistic Lock), 顧名思義,就是很樂觀,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會(huì)修改,所以不會(huì)上鎖,但是在更新的時(shí)候會(huì)判斷一下在此期間別人有沒有去更新這個(gè)數(shù)據(jù),可以使用版本號等機(jī)制。樂觀鎖適用于多讀的應(yīng)用類型,這樣可以提高吞吐量。
樂觀鎖策略:提交版本必須大于記錄當(dāng)前版本才能執(zhí)行更新
樂觀鎖也并不是盲目的樂觀,比如張三改微信號,李四該qq號,同時(shí)進(jìn)行,開始的時(shí)候版本號都是1,然后張三改完了微信號就去提交,此時(shí)版本號從1到2,李四改完了也去提交,此時(shí)從1卻變成3,就會(huì)報(bào)異常,重新修改。
工作中一般用樂觀鎖
初始化信用卡可用余額和欠額
無加塞篡改,先監(jiān)控再開啟multi, 保證兩筆金額變動(dòng)在同一個(gè)事務(wù)內(nèi)
在監(jiān)聽的時(shí)候,發(fā)現(xiàn)另外一個(gè)事務(wù)修改了共享數(shù)據(jù),導(dǎo)致事務(wù)執(zhí)行失敗
在修改數(shù)據(jù)之前,需要加鎖watch,否則會(huì)導(dǎo)致出錯(cuò)。如果有人修改了我的數(shù)據(jù),我就會(huì)報(bào)異常。
有加塞篡改
監(jiān)控了key,如果key被修改了,后面一個(gè)事務(wù)的執(zhí)行失效
unwatch
取消watch命令對所有key的監(jiān)視
一旦執(zhí)行了exec之前加的監(jiān)控鎖都會(huì)被取消掉了
小結(jié)
Watch指令,類似樂觀鎖,事務(wù)提交時(shí),如果Key的值已被別的客戶端改變, 比如某個(gè)list已被別的客戶端push/pop過了,整個(gè)事務(wù)隊(duì)列都不會(huì)被執(zhí)行
通過WATCH命令在事務(wù)執(zhí)行之前監(jiān)控了多個(gè)Keys,倘若在WATCH之后有任何Key的值發(fā)生了變化, EXEC命令執(zhí)行的事務(wù)都將被放棄,同時(shí)返回Nullmulti-bulk應(yīng)答以通知調(diào)用者事務(wù)執(zhí)行失敗
3階段
? 開啟:以MULTI開始一個(gè)事務(wù)
? 入隊(duì):將多個(gè)命令入隊(duì)到事務(wù)中,接到這些命令并不會(huì)立即執(zhí)行,而是放到等待執(zhí)行的事務(wù)隊(duì)列里面
? 執(zhí)行:由EXEC命令觸發(fā)事務(wù)
3特性
單獨(dú)的隔離操作:事務(wù)中的所有命令都會(huì)序列化、按順序地執(zhí)行。事務(wù)在執(zhí)行的過程中,不會(huì)被其他客戶端發(fā)送來的命令請求所打斷。
沒有隔離級別的概念:隊(duì)列中的命令沒有提交之前都不會(huì)實(shí)際的被執(zhí)行,因?yàn)槭聞?wù)提交前任何指令都不會(huì)被實(shí)際執(zhí)行, 也就不存在”事務(wù)內(nèi)的查詢要看到事務(wù)里的更新,在事務(wù)外查詢不能看到”這個(gè)讓人萬分頭痛的問題
不保證原子性:redis同一個(gè)事務(wù)中如果有一條命令執(zhí)行失敗,其后的命令仍然會(huì)被執(zhí)行,沒有回滾
不遵循傳統(tǒng)的ACID中的AI
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“redis事務(wù)有什么用”這篇文章對大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。