一、redis似乎并沒有“事務”,那些用到“事務”的人在做什么
Redis主要是針(zhen)對單個key,或者說,單個數據對象的(de)(de)操作,這樣,事務里的(de)(de)多對象Atomic要求就很低。
當Redis的(de)命令(ling)執行多(duo)對象操(cao)作,比如(ru)MSET命令(ling),或者Redis的(de)Transaction命令(ling)(也(ye)含LUA),涉及多(duo)數據(ju)對象時,其內部(bu),是順序執行的(de)(這也(ye)是我們說的(de),Redis是單線程架構(gou)),相當于傳統DB的(de)Serialize級別(bie)。這時,ACID里的(de)Isolation在(zai)Redis里就極其簡(jian)化,因為不存(cun)在(zai)兩個并發(fa)事務互(hu)相的(de)干擾,即Redis不存(cun)在(zai)并發(fa)命令(ling)。
Redis的Transaction命令,不(bu)是嚴格意義的事務,因(yin)為缺乏(fa)Rollback。
磁(ci)盤(pan)(pan)的AOF或RDB文件,只是個備份(fen),不是傳統意義上的DB的Dataset包(bao)含磁(ci)盤(pan)(pan)數(shu)據的概念,所以,把Redis的磁(ci)盤(pan)(pan)數(shu)據,看成整(zheng)個Dataset的一(yi)部分,是不對的,還(huan)是只考(kao)慮Redis的內存特(te)性(xing),即它是內存數(shu)據庫(ku)。
Redis 只(zhi)是提(ti)供(gong)了簡單的(de)(de)(de)事(shi)務功能。其本(ben)(ben)質是一組(zu)命(ming)(ming)令(ling)(ling)的(de)(de)(de)集合,事(shi)務支(zhi)持一次執(zhi)(zhi)行(xing)(xing)多(duo)個命(ming)(ming)令(ling)(ling),在事(shi)務執(zhi)(zhi)行(xing)(xing)過程(cheng)(cheng)中,會順序執(zhi)(zhi)行(xing)(xing)隊列中的(de)(de)(de)命(ming)(ming)令(ling)(ling),其他客戶(hu)端(duan)提(ti)交的(de)(de)(de)命(ming)(ming)令(ling)(ling)請求(qiu)不(bu)會插(cha)入到本(ben)(ben)事(shi)務執(zhi)(zhi)行(xing)(xing)命(ming)(ming)令(ling)(ling)序列中。命(ming)(ming)令(ling)(ling)的(de)(de)(de)執(zhi)(zhi)行(xing)(xing)過程(cheng)(cheng)是順序執(zhi)(zhi)行(xing)(xing)的(de)(de)(de),但(dan)不(bu)能保證原子性。無法像 MySQL 那(nei)樣,有隔(ge)離級別(bie),出了問題之后還能回滾(gun)數據等(deng)高級操作。
延伸閱讀:
二、Redis事務的應用場景
在分布式系(xi)統和(he)高并發場景下(xia),事(shi)(shi)務處理具有重(zhong)要(yao)意義。Redis事(shi)(shi)務可以確(que)保(bao)數據的一致(zhi)性,避免并發操作(zuo)導(dao)致(zhi)的數據不一致(zhi)問題。以下(xia)是一些Redis事(shi)(shi)務的應用場景:
批量操作:Redis 事務可以將多個命令打包成一個單元來執行,可以減少與 Redis 服務器的通信次數,從而提高性能。數據庫遷移:在遷移數據時,需要保證數據一致性。通過Redis事務,可以確保數據在遷移過程中不會出現不一致的情況。分布式鎖:在分布式系統中,為了保證數據的一致性,需要實現分布式鎖。通過Redis事務,可以在同一個事務中執行鎖定、解鎖等操作,確保鎖的原子性。這些應用(yong)(yong)場景展示了Redis事務在實際應用(yong)(yong)中的價值。接(jie)下來(lai),我們將詳細介紹(shao)Redis事務的基本(ben)命(ming)令(ling)、特性和實現原理(li)。