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