Redis学习笔记五:独立功能之事务
Redis 事務提供了一種將多個命令請求打包,然后一次性、按順序地執(zhí)行多個命令的機制,并且在事務執(zhí)行期間,服務器不會中斷,會將事務中的所以命令都執(zhí)行完畢才去處理其他客戶端的命令請求。
事務的實現(xiàn)
事務開始
MULTI 命令意味著事務的開始。
事務從開始到結(jié)束包含三個階段:事務開始、命令入隊、事務執(zhí)行。
multi 命令將執(zhí)行命令的客戶端從非事務切換到事務狀態(tài),這一切換是通過在客戶端狀態(tài)的 flags 屬性中打開 REDIS_MULTI 標識完成的。返回客戶端 OK。
命令入隊
在事務狀態(tài)中,服務器會立刻執(zhí)行 exec、discard、watch、multi 四個命令中的一個,而非這些命令將會放入事務事務隊列,然后返回 QUEUED。
事務隊列
每個 Redis 客戶端都有自己的事務狀態(tài),這個事務狀態(tài)保存在客戶端狀態(tài)的 mstate 屬性里:
執(zhí)行事務
當一個處于事務狀態(tài)的客戶端向服務器發(fā)送 exec 命令時,這個 exec 命令將立刻被服務器執(zhí)行,遍歷事務隊列執(zhí)行所有命令,最后將執(zhí)行命令所得的結(jié)果全部返回給客戶端。
watch 命令的實現(xiàn)
watch 命令是個樂觀鎖,它可以在 exec 命令執(zhí)行前,監(jiān)視任意數(shù)量的數(shù)據(jù)庫鍵。當發(fā)現(xiàn)有修改則拒絕事務執(zhí)行并向客戶端返回代表事務執(zhí)行失敗的空回復。
使用 watch 命令監(jiān)視數(shù)據(jù)庫鍵
每個 Redis 數(shù)據(jù)庫都保存著一個 watched_keys 字典,鍵是被 watch 命令監(jiān)視的數(shù)據(jù)庫鍵,字典值是所有監(jiān)視這個鍵的客戶端鏈表。
監(jiān)視機制的觸發(fā)
所有對于數(shù)據(jù)庫進行修改的命令執(zhí)行后都會調(diào)用 multi.c/touchWatchKey 函數(shù)對 watched_keys 字典進行檢查,如果有客戶端正在監(jiān)視剛剛被命令修改過的數(shù)據(jù)庫鍵,touchWatchKey 函數(shù)會將監(jiān)視被修改鍵的客戶端的 REDIS_DIRTY_CAS 標識打開,表示客戶端的事務安全性被破壞。
判斷事務是否安全
當服務器收到客戶端發(fā)來的 exec 命令時,服務器會根據(jù)這個客戶端是否打開了 REDIS_DIRTY_CAS 標識來決定是否執(zhí)行事務。
事務的 ACID 性質(zhì)
A:Atomicity,原子性;
C:Consistency,一致性;
I:Isolation,隔離性;
D:Durability,耐久性。
原子性
原子性是指將事務中的多個操作作為一個整體來執(zhí)行,要么全部執(zhí)行成功,要么一個都不執(zhí)行。Redis 不支持事務回滾機制,即使事務隊列中的某個命令在執(zhí)行期間出現(xiàn)了錯誤,整個事務也會繼續(xù)執(zhí)行下去,直到將事務隊列中的所有命令都執(zhí)行完畢為止。
一致性
如果數(shù)據(jù)庫在執(zhí)行事務之前是一致的,那么在事務執(zhí)行之后無論事務是否執(zhí)行成功,數(shù)據(jù)庫應該是一致的。一致是指數(shù)據(jù)符合數(shù)據(jù)庫本身的定義和要求,沒有包含非法或者無效的錯誤數(shù)據(jù)。
隔離性
即使數(shù)據(jù)庫有多個事務并發(fā)地執(zhí)行,各個事務之間也不會互相影響,并發(fā)和串行狀態(tài)事務產(chǎn)生的結(jié)果完全相同。
耐久性
當一個事務執(zhí)行完畢時,執(zhí)行這個事務所得到的結(jié)果已經(jīng)被保存到永久存儲介質(zhì)里,即使事務執(zhí)行完畢后停機,執(zhí)行事務的結(jié)果也不會丟失。
轉(zhuǎn)載于:https://www.cnblogs.com/liushijie/p/5095297.html
總結(jié)
以上是生活随笔為你收集整理的Redis学习笔记五:独立功能之事务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想小新笔记本怎么设备u盘 如何在联想小
- 下一篇: 大白菜win7怎么装系统教程图解 图解教