最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

2023-06-09:什么是Redis事務(wù)?原理是什么?

2023-06-09 21:23 作者:福大大架構(gòu)師每日一題  | 我要投稿

2023-06-09:什么是Redis事務(wù)?原理是什么?

答案2023-06-09:

Redis中的事務(wù)是以一組命令的形式出現(xiàn)的,這些命令被認(rèn)為是最小的執(zhí)行單位。事務(wù)可以保證在一個(gè)單獨(dú)獨(dú)立的隔離操作中執(zhí)行所有命令,而且所有命令都會(huì)按照指定的順序經(jīng)過序列化后被執(zhí)行。在服務(wù)端執(zhí)行事務(wù)的過程中,不受其他客戶端發(fā)送給Redis的命令請(qǐng)求的干擾影響。

Redis 事務(wù)的注意點(diǎn)有哪些?

Redis事務(wù)的使用需要注意以下幾點(diǎn):

1.Redis 事務(wù)不支持回滾,不能像 MySQL 的事務(wù)那樣可以選擇性地輸出。一旦命令提交給Redis,就會(huì)被執(zhí)行,無法扔回到事務(wù)的起點(diǎn)。

2.Redis事務(wù)是原子執(zhí)行的,要么全部執(zhí)行成功,要么放棄執(zhí)行。如果其中一個(gè)命令失敗,則整個(gè)事務(wù)都會(huì)失敗,但不會(huì)因?yàn)槠渲幸粋€(gè)命令失敗而導(dǎo)致其他命令的執(zhí)行效果不確定。

3.執(zhí)行事務(wù)期間,Redis服務(wù)器不會(huì)中斷執(zhí)行,也不會(huì)被其他客戶機(jī)的請(qǐng)求干擾,這保證了事務(wù)操作期間的隔離性和原子性。

4.事務(wù)中的命令都是串行執(zhí)行的,并且事務(wù)會(huì)盡量縮短命令合并的時(shí)間。如果有多個(gè)客戶端同時(shí)訪問同一個(gè)命令,會(huì)根據(jù)請(qǐng)求的時(shí)間順序進(jìn)行處理,避免了競爭和死鎖。

Redis 事務(wù)為什么不支持回滾?

Redis事務(wù)執(zhí)行期間不支持回滾的主要原因是為了避免增加復(fù)雜的實(shí)現(xiàn)邏輯和增加系統(tǒng)負(fù)擔(dān)。 Redis只能通過在事務(wù)提交前執(zhí)行所有命令來保證原子性的特性。如果Redis支持回滾,則必須存儲(chǔ)事務(wù)執(zhí)行前的狀態(tài),并在回滾后重置狀態(tài),這樣會(huì)增加顯著的存儲(chǔ)和計(jì)算負(fù)擔(dān)。

當(dāng)命令執(zhí)行期間發(fā)生語法錯(cuò)誤等問題,Redis會(huì)在執(zhí)行失敗時(shí)報(bào)錯(cuò),開發(fā)人員可以通過編寫代碼來處理這些錯(cuò)誤。但是出現(xiàn)嚴(yán)重問題時(shí),如網(wǎng)絡(luò)故障或硬件問題等,Redis仍然會(huì)執(zhí)行已經(jīng)提交的事務(wù)命令,此時(shí)數(shù)據(jù)可能會(huì)出現(xiàn)嚴(yán)重不一致,需要開發(fā)人員自行修復(fù)。

總之,雖然沒有回滾功能,但是Redis事務(wù)仍然是非常有用和實(shí)用的功能,能夠提供高效、快速和可靠的多命令操作。開發(fā)人員需謹(jǐn)慎處理錯(cuò)誤處理方式和保證數(shù)據(jù)一致性,以獲得最佳實(shí)踐的體驗(yàn)。

事務(wù)

事務(wù)是一組操作或動(dòng)作的集合,這些操作要么全部執(zhí)行,要么全部不執(zhí)行。在執(zhí)行事務(wù)期間,可以保證隔離性和原子性,即在同一事務(wù)中執(zhí)行的操作相互獨(dú)立,不受其他事務(wù)的干擾。如果其中一個(gè)操作發(fā)生錯(cuò)誤,則僅回滾該事務(wù),而不影響其他事務(wù)的執(zhí)行結(jié)果。事務(wù)通常用于需要一系列操作來完成的任務(wù),例如向數(shù)據(jù)庫中插入多個(gè)數(shù)據(jù),或?qū)⒍鄠€(gè)操作組合成一個(gè)原子操作。

以社交網(wǎng)站上用戶A關(guān)注用戶B為例,這個(gè)動(dòng)作需要在用戶A的關(guān)注表中添加用戶B,并在用戶B的粉絲表中添加用戶A。將這兩個(gè)操作組合成事務(wù),可以確保在同一個(gè)事務(wù)中執(zhí)行,要么全部執(zhí)行,要么全部不執(zhí)行。這樣可以避免出現(xiàn)數(shù)據(jù)不一致的情況,確保關(guān)注關(guān)系的正確性。使用事務(wù)可以將多個(gè)數(shù)據(jù)庫操作組合成一個(gè)原子操作,保證數(shù)據(jù)的一致性。

Redis提供了簡單的事務(wù)功能,以multi命令開始事務(wù),并在調(diào)用exec命令結(jié)束事務(wù)。將需要一起執(zhí)行的命令放在multi和exec之間,Redis會(huì)將這些命令作為一個(gè)原子操作來處理,要么全部執(zhí)行,要么全部不執(zhí)行。如果在事務(wù)執(zhí)行期間需要取消已經(jīng)執(zhí)行的命令,可以使用discard命令回滾整個(gè)事務(wù)。利用Redis的事務(wù)功能,可以執(zhí)行多個(gè)命令并確保它們?cè)谕粋€(gè)事務(wù)中執(zhí)行,避免了因單個(gè)命令執(zhí)行失敗而導(dǎo)致的數(shù)據(jù)不一致問題。

一個(gè)客戶端

image.png

另外一個(gè)客戶端

在事務(wù)沒有提交的時(shí)查詢(查不到數(shù)據(jù))

image.png

在事務(wù)提交后查詢(可以查到數(shù)據(jù))

image.png

可以看到sadd命令此時(shí)的返回結(jié)果是QUEUED,代表命令并沒有真正執(zhí)行,而是暫時(shí)保存在Redis中的一個(gè)緩存隊(duì)列(所以discard也只是丟棄這個(gè)緩存隊(duì)列中的未執(zhí)行命令,并不會(huì)回滾已經(jīng)操作過的數(shù)據(jù),這一點(diǎn)要和關(guān)系型數(shù)據(jù)庫的Rollback操作區(qū)分開)。

只有當(dāng)exec執(zhí)行后,用戶A關(guān)注用戶B的行為才算完成,如下所示exec返回的兩個(gè)結(jié)果對(duì)應(yīng)sadd命令。

但是要注意Redis的事務(wù)功能很弱。在事務(wù)回滾機(jī)制上,Redis只能對(duì)基本的語法錯(cuò)誤進(jìn)行判斷。

如果事務(wù)中的命令出現(xiàn)錯(cuò)誤,Redis 的處理機(jī)制也不盡相同。

1、語法命令錯(cuò)誤

image.png

例如下面操作錯(cuò)將set寫成了sett,屬于語法錯(cuò)誤,會(huì)造成整個(gè)事務(wù)無法執(zhí)行,事務(wù)內(nèi)的操作都沒有執(zhí)行:

2、運(yùn)行時(shí)錯(cuò)誤

例如:事務(wù)內(nèi)第一個(gè)命令簡單的設(shè)置一個(gè)string類型,第二個(gè)對(duì)這個(gè)key進(jìn)行sadd命令,這種就是運(yùn)行時(shí)命令錯(cuò)誤,因?yàn)檎Z法是正確的:

image.png

可以看到Redis并不支持回滾功能,第一個(gè)set命令已經(jīng)執(zhí)行成功,開發(fā)人員需要自己修復(fù)這類問題。

Redis的事務(wù)原理

Redis的事務(wù)是在服務(wù)器端實(shí)現(xiàn)的,當(dāng)用戶執(zhí)行MULTI命令時(shí),服務(wù)器將對(duì)應(yīng)的客戶端對(duì)象設(shè)置為一個(gè)專門的狀態(tài),此狀態(tài)下所有后續(xù)用戶所執(zhí)行的查詢命令都不會(huì)被立即執(zhí)行,而是被保存在一個(gè)事務(wù)隊(duì)列中,直到用戶執(zhí)行EXEC命令為止。在執(zhí)行EXEC命令前或在事務(wù)途中,客戶端可以隨時(shí)調(diào)用DISCARD命令來取消事務(wù)。當(dāng)用戶執(zhí)行EXEC命令時(shí),服務(wù)器會(huì)將該客戶端對(duì)象中緩存的命令按照它們提交的順序依次執(zhí)行,并將執(zhí)行結(jié)果返回給客戶端。使用Redis事務(wù)可以將一系列命令作為單個(gè)原子操作執(zhí)行,從而保證了操作的一致性。


2023-06-09:什么是Redis事務(wù)?原理是什么?的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
德州市| 嵊泗县| 禹城市| 兴海县| 丰台区| 沧源| 桃江县| 沐川县| 海盐县| 天长市| 辉南县| 平遥县| 台南县| 咸宁市| 盐源县| 华池县| 东乌| 股票| 定西市| 溧水县| 金乡县| 湘潭市| 庆城县| 社会| 延吉市| 乌拉特中旗| 道真| 卓尼县| 新源县| 弥渡县| 武鸣县| 确山县| 宝清县| 和龙市| 常熟市| 化隆| 太保市| 刚察县| 嘉鱼县| 襄樊市| 文安县|