柚子快報激活碼778899分享:詳解Redis之事務(wù)
柚子快報激活碼778899分享:詳解Redis之事務(wù)
目錄
Redis事務(wù)
概念
特性
常用命令
MULTI
EXEC
DISCARD
WATCH
UNWATCH
使用演示
使用場景
注意事項(xiàng)
Redis事務(wù)
概念
Redis事務(wù)和MySQL的事務(wù)在概念上是類似的,都是把一系列操作綁定成一組,讓這一組能夠批量執(zhí)行。但是,Redis事務(wù)和MySQL事務(wù)在特性上有所不同,Redis事務(wù)沒有回滾機(jī)制,只能保證這些操作批量執(zhí)行,不能做到“一個失敗就恢復(fù)到初始狀態(tài)”。
Redis 事務(wù)本質(zhì)上是在服務(wù)器上搞了?個 "事務(wù)隊(duì)列". 每次客?端在事務(wù)中進(jìn)??個操作, 都會把命令先發(fā)給服務(wù)器, 放到 "事務(wù)隊(duì)列" 中(但是并不會?即執(zhí)?) ?是會在真正收到 EXEC 命令之后, 才真正執(zhí)?隊(duì)列中的所有操作.?
特性
1.弱化的原子性: Redis事務(wù)中的所有命令都會序列化、按順序地執(zhí)行,執(zhí)行過程中不會被其他客戶端的命令請求打斷。 但是,Redis事務(wù)沒有回滾機(jī)制。如果事務(wù)中的某個命令執(zhí)行失敗,其他命令仍然會繼續(xù)執(zhí)行,事務(wù)不會因?yàn)橐粋€命令的失敗而回滾到初始狀態(tài)。 2.不保證一致性: 由于Redis事務(wù)沒有回滾機(jī)制,且沒有涉及“約束”,因此事務(wù)執(zhí)行過程中如果某個修改操作出現(xiàn)失敗,就可能引起不一致的情況。 3.不需要隔離性: Redis是單線程處理請求的,因此不需要隔離級別,也不會并發(fā)執(zhí)行事務(wù)。 4.不需要持久性: Redis事務(wù)是保存在內(nèi)存中的,是否開啟持久化是redis-server自己的事情,和事務(wù)無關(guān)。
常用命令
MULTI
功能:開啟一個事務(wù)。 執(zhí)行成功返回OK。當(dāng)開啟事務(wù)后,客戶端可以繼續(xù)向服務(wù)器發(fā)送任意多條命令,這些命令不會立即被執(zhí)行,而是被放到一個隊(duì)列中。當(dāng)EXEC命令被調(diào)用時,所有隊(duì)列中的命令才會被執(zhí)行。
EXEC
功能:真正執(zhí)行事務(wù)。 每次添加一個操作,都會提示“QUEUED”,說明命令已經(jīng)進(jìn)入服務(wù)端的隊(duì)列。當(dāng)執(zhí)行EXEC命令時,服務(wù)器才會真正執(zhí)行這些命令。 EXEC命令的回復(fù)是一個數(shù)組,數(shù)組中的每個元素都是執(zhí)行事務(wù)中的命令所產(chǎn)生的回復(fù)?;貜?fù)元素的先后順序和命令發(fā)送的先后順序一致。
DISCARD
功能:放棄當(dāng)前事務(wù)。 直接清空事務(wù)隊(duì)列,之前的操作都不會真正執(zhí)行。
WATCH
一定要在開啟事務(wù)之前使用?。?!
功能:監(jiān)控一個或多個鍵。 當(dāng)開啟事務(wù)時,如果對WATCH的鍵進(jìn)行修改(在EXEC命令執(zhí)行之前),就會記錄當(dāng)前鍵的“版本號”。在真正提交事務(wù)時(執(zhí)行EXEC命令時),如果發(fā)現(xiàn)當(dāng)前服務(wù)器上的鍵的版本號已經(jīng)超過了事務(wù)開始時的版本號,就會讓事務(wù)執(zhí)行失敗。 WATCH命令本質(zhì)上是給EXEC加了個判定條件,屬于“樂觀鎖”。
UNWATCH
功能:取消對鍵的監(jiān)控。 相當(dāng)于WATCH的逆操作。
使用演示
沒開啟事務(wù),一方修改,另一方能實(shí)時看到
開啟事務(wù),一方修改,另一方看不到,直到事務(wù)執(zhí)行完畢?
開啟事務(wù),一方修改,另一方針對同一Key修改,最終value為執(zhí)行事務(wù)設(shè)置的value?
WATCH只能在開啟事務(wù)前使用?
使用WATCH,開啟事務(wù),在事務(wù)中修改Key之前,Key被修改,在事務(wù)中修改Key,當(dāng)執(zhí)行EXEC會提示(nil),Key的value依舊是另一方設(shè)置的value
使用場景
Redis事務(wù)適用于需要把多個操作打包進(jìn)行的情況。例如,在商品搶購場景中,如果使用Redis事務(wù),可以避免多線程下的線程安全問題。通過Redis事務(wù),可以確保一系列操作(如檢查庫存、扣減庫存等)的原子性執(zhí)行,從而避免數(shù)據(jù)不一致的問題。
注意事項(xiàng)
1.鎖的釋放: 在使用WATCH命令進(jìn)行樂觀鎖控制時,需要注意在事務(wù)執(zhí)行完畢后及時釋放鎖(即取消對鍵的監(jiān)控)。如果忘記釋放鎖或因?yàn)楫惓?dǎo)致鎖無法釋放,則可能會導(dǎo)致死鎖問題。 2.事務(wù)的失敗處理: 由于Redis事務(wù)沒有回滾機(jī)制,因此需要在設(shè)計(jì)業(yè)務(wù)邏輯時考慮到事務(wù)失敗的處理方式。例如,可以通過檢查命令的返回值來判斷命令是否執(zhí)行成功,并采取相應(yīng)的處理措施。 3.避免事務(wù)過大: 如果事務(wù)過大(包含過多的命令),可能會導(dǎo)致Redis服務(wù)器的性能下降。因此,需要合理控制事務(wù)的大小,避免將過多的命令放入一個事務(wù)中執(zhí)行。
柚子快報激活碼778899分享:詳解Redis之事務(wù)
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。