日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis学习笔记五:独立功能之事务

發(fā)布時間:2024/10/12 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis学习笔记五:独立功能之事务 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Redis 事務提供了一種將多個命令請求打包,然后一次性、按順序地執(zhí)行多個命令的機制,并且在事務執(zhí)行期間,服務器不會中斷,會將事務中的所以命令都執(zhí)行完畢才去處理其他客戶端的命令請求。

事務的實現(xiàn)

事務開始

MULTI 命令意味著事務的開始。
事務從開始到結(jié)束包含三個階段:事務開始、命令入隊、事務執(zhí)行。

127.0.0.1:6379> multi OK

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 屬性里:

typedef struct redisClient { // ...multiState mstate; /* MULTI/EXEC state */ // ... }typedef struct multiState {multiCmd *commands; /* Array of MULTI commands */int count; /* Total number of MULTI commands */int minreplicas; /* MINREPLICAS for synchronous replication */time_t minreplicas_timeout; /* MINREPLICAS timeout as unixtime. */ } multiState;/* Client MULTI/EXEC state */ typedef struct multiCmd {robj **argv;int argc;struct redisComm,and *cmd; } multiCmd;

執(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。