網(wǎng)站后臺圖片傳不上去怎么辦汕頭seo外包機構
前言
?相關系列
- 《Redis & 目錄》
- 《Redis & 事務 & 源碼》
- 《Redis & 事務 & 總結(jié)》
- 《Redis & 事務 & 問題》
?
?參考文獻
- 《Redis事務詳解》
?
?
Redis事務是什么?
????標準的事務是指執(zhí)行時具備原子性/一致性/隔離性/持久性的一系列操作。
- 原子性:一系列操作要么一起成功,要么一起失敗;
- 一致性:保證事務執(zhí)行前后的數(shù)據(jù)狀態(tài)一致;
- 隔離性:多事務并發(fā)執(zhí)行時不會相互影響;
- 持久性:事務遞交后數(shù)據(jù)會被永久保存。
????Redis事務并不嚴格具備上述特性,因此將之單純視為批處理其實更加合適,其唯一的作用就是確保一系列指令會被連續(xù)執(zhí)行,即不會出現(xiàn)有其它指令間隔的情況。
?
?
Redis事務怎么使用?
????通過依次使用{MULTI} --> 一系列讀/寫 --> {EXEC}指令執(zhí)行事務,而在事務未正式執(zhí)行前可以通過{DISCARD}指令取消事務。此外為了避免事務的目標數(shù)據(jù)在執(zhí)行過程中被其它事務/指令修改,還可以在開啟事務前先通過{WATCH}指令監(jiān)控指定鍵集,在鍵集中任意鍵的值被改動的情況下事務都將無法被執(zhí)行。
?
?
Redis事務有幾個階段?
????事務有組隊/執(zhí)行兩個階段。組隊階段由{MULTI}指令開啟,用于將后續(xù)輸入的一系列讀/寫指令加入組隊隊列中;而執(zhí)行階段則由{EXEC}指令開啟,負責執(zhí)行組隊隊列中的所有指令。
?
?
Redis事務支持隔離性嗎?
????隔離性不是一個有無的概念,因為事務之間無論是完全影響還是完全不影響都屬于隔離性的范疇,因此隔離性實際上是程度高低的問題。那Redis事務又具備什么級別的隔離性呢?以MySQL的四個隔離級別來說其大概對應了“讀已遞交”級別的隔離性。那為什么是“讀已遞交”級別呢?這是因為事務被分為組隊/執(zhí)行兩個階段,而在這兩個階段中執(zhí)行階段雖說會串行執(zhí)行,但組隊階段卻是允許和其它組隊/執(zhí)行階段并行執(zhí)行的。因此處于組隊階段的事務其目標數(shù)據(jù)完全可能被其它處于執(zhí)行階段的事務所修改,從而出現(xiàn)事務執(zhí)行結(jié)果錯誤的問題。那為什么說對應的是“讀已遞交”級別呢?這是因為Redis事務沒有全局遞交的概念,事務中每條執(zhí)行的執(zhí)行都可以視為一次遞交,因此不符合“讀未遞交”的情景。
?
?
Redis事務保證原子性嗎?是否支持回滾?
????Redis事務保證“偽”原子性。Redis事務有組隊/執(zhí)行兩個階段,在組隊階段中任意指令的語法錯誤都將導致整個事務拒絕被執(zhí)行,因此事務在組隊階段是具備原子性的。但在執(zhí)行階段中指令的錯誤執(zhí)行并不會對事務造成影響,事務依然會繼續(xù)向后執(zhí)行至徹底結(jié)束為止,因此事務在執(zhí)行階段時并不具備原子性,故而才說Redis事務只具備偽原子性,并且其也不支持回滾。
?
?
Redis事務有什么其它實現(xiàn)嗎?
- Redis可以通過Lua腳本保證腳本內(nèi)的命令按順序一次性執(zhí)行,但同理其也不支持回滾;
- 人為設置代表事務是否開始/結(jié)束的標記變量,并在正式執(zhí)行前通過該變量確保無事務正在執(zhí)行。