分布式内存数据库--Redis事务
一、 事務(wù):
與關(guān)系型數(shù)據(jù)庫一樣redis也支持事務(wù)。也就是可以一次執(zhí)行多個(gè)命令,本質(zhì)是一組命令的集合。一個(gè)事務(wù)中的所有命令都會序列化,按順序地串行化執(zhí)行而不會被其它命令插入,不許加塞。
二、 事務(wù)能干嘛?
一個(gè)隊(duì)列中,一次性、順序性、排他性的執(zhí)行一系列命令。
三、 redis事務(wù)支持的命令
1、 MULTI:標(biāo)記一個(gè)事務(wù)塊的開始。 隨后的指令將在執(zhí)行EXEC時(shí)作為一個(gè)原子執(zhí)行。
2、 EXEC:執(zhí)行事務(wù)中所有在排隊(duì)等待的指令并將鏈接狀態(tài)恢復(fù)到正常 當(dāng)使用WATCH 時(shí),只有當(dāng)被監(jiān)視的鍵沒有被修改,且允許檢查設(shè)定機(jī)制時(shí),EXEC會被執(zhí)行。
3、 DISCARD:刷新一個(gè)事務(wù)中所有在排隊(duì)等待的指令,并且將連接狀態(tài)恢復(fù)到正常。如果已使用WATCH,DISCARD將釋放所有被WATCH的key。
4、 WATCH:標(biāo)記所有指定的key 被監(jiān)視起來,在事務(wù)中有條件的執(zhí)行(樂觀鎖)。
事務(wù)可以一次執(zhí)行多個(gè)命令, 并且?guī)в幸韵聝蓚€(gè)重要的保證:
事務(wù)是一個(gè)單獨(dú)的隔離操作:事務(wù)中的所有命令都會序列化、按順序地執(zhí)行。事務(wù)在執(zhí)行的過程中,不會被其他客戶端發(fā)送來的命令請求所打斷。事務(wù)是一個(gè)原子操作:事務(wù)中的命令要么全部被執(zhí)行,要么全部都不執(zhí)行。
四、 redis事務(wù)的操作
1、 正常執(zhí)行
使用MULTI開啟一個(gè)事務(wù),每當(dāng)添加一個(gè)命令,將該命令加入隊(duì)列,使用EXEC命令提交時(shí)全部執(zhí)行。
2、 放棄事務(wù)
使用命令DISCARD取消事務(wù)。
3、 全體連坐
全體連坐的意思就是在一個(gè)事務(wù)中有一條語句語法有錯(cuò)誤就會導(dǎo)致這條事務(wù)全部失效。
命令出錯(cuò),所有的命令失效。
4、 冤頭債主
意思就是在所有的命令均為正確的情況下,其中一條命令沒有拿到數(shù)據(jù),而導(dǎo)致該條數(shù)據(jù)為空,但是其他命令還是會執(zhí)行成功。
K99不存在,但是其他的命令還是執(zhí)行成功。
5、 WATCH操作
WATCH用于監(jiān)控鍵是否發(fā)生改變。被 WATCH 的鍵會被監(jiān)視,并會發(fā)覺這些鍵是否被改動過了。 如果有至少一個(gè)被監(jiān)視的鍵在 EXEC 執(zhí)行之前被修改了, 那么整個(gè)事務(wù)都會被取消, EXEC 返回nil-reply來表示事務(wù)已經(jīng)失敗。
悲觀鎖:
每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人會修改,所以每次在拿數(shù)據(jù)的時(shí)候都會上鎖,這樣別人想拿這個(gè)數(shù)據(jù)就會block直到它拿到鎖。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊就用到了很多這種鎖機(jī)制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。
樂觀鎖:
每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會修改,所以不會上鎖,但是在更新的時(shí)候會判斷一下在此期間別人有沒有去更新這個(gè)數(shù)據(jù),可以使用版本號等機(jī)制。樂觀鎖適用于多讀的應(yīng)用類型,這樣可以提高吞吐量。
WATCH使用的是樂觀鎖策略。
一旦執(zhí)行了exec之前加的監(jiān)控鎖都會被取消掉了?;蛘呤褂胾nwatch取消監(jiān)控。
小結(jié)
1、WATCH類似于樂觀鎖,在事務(wù)提交時(shí),如果key的值已被別的客戶端改變,整個(gè)事務(wù)隊(duì)列都不會執(zhí)行。
2、通過WATCH命令在事務(wù)執(zhí)行之前監(jiān)控了多個(gè)keys,若在WATCH之后key的值發(fā)生了變化,EXEC命令執(zhí)行的事務(wù)將被放棄。
3、事務(wù)的三階段
開啟–MULTI,入隊(duì),執(zhí)行-EXEC。
4、事務(wù)的三特性
單獨(dú)隔離操作、沒有隔離級別的概念、不保證原子性(執(zhí)行失敗、集體連坐、冤頭債主等)。
總結(jié)
以上是生活随笔為你收集整理的分布式内存数据库--Redis事务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式内存数据库---Redis的持久化
- 下一篇: linux cmake编译源码,linu