第十九章 事務

2022-06-15 15:00:16 字數 1716 閱讀 7834

redis的事務是指將多個命令請求打包,一次性地,按順序執行的機制。通過multi、exec、watch等命令實現事務功能。

19.1.1 事務的開始

multi命令的執行代表了乙個事務的開始,會將執行該命令的客戶端由非事務狀態切換成事務狀態(在客戶端狀態的flags屬性中開啟redis_multi標識)

19.1.2 命令入隊

19.1.3 事務佇列

每個redis客戶端由自己的事務狀態,儲存在mstate屬性中

typedef struct

redisclient

事務狀態包含了乙個事務佇列(乙個multicmd型別的陣列),以及入隊命令的計數器

typedef struct

multistatemultistate;

typedef struct

multicmdmulticmd;

19.1.4 執行事務

當處於事務狀態的客戶端向伺服器傳送exec命令時,伺服器會將客戶端狀態事務佇列中的所有命令順序執行,每執行完乙個命令將結果暫存,全部執行完之後,移除客戶端的事務狀態標識,並清空客戶端的事務狀態,包括入隊命令計數器和釋放事務佇列,最後將所有結果返回給客戶端

watch命令是乙個樂觀鎖,用於監測任意數量的資料庫鍵,在exec執行時,檢測被監視的鍵是否至少有乙個已經被修改了,如果是的話,伺服器將拒絕執行事務,並向客戶端返回代表事務執行失敗的空回覆。

19.2.1 使用watch命令監視資料庫鍵

每個redis資料庫儲存了乙個watched_keys字典,字典的鍵是被監視的資料庫的鍵,字典的值是乙個鍊錶,儲存了監視這個鍵的所有客戶端  

typedef struct

redisdbredisdb;

客戶端通過執行watch命令,將自身新增到watched_keys字典當中

19.2.2 監視機制的觸發

所有對資料庫進行鍵相關的操作命令,在執行完畢之後,都會檢查watched_keys字典,檢視相應的鍵是否有正在監視的客戶端,有的話,會開啟對應客戶端的redis_dirty_cas標識,表示該客戶端的事務安全性被破壞

19.2.3 判斷事務是否安全

當客戶端發起exec命令時,伺服器會檢查當前客戶端是否開啟了redis_dirty_cas標識,開啟則拒絕執行事務

a原子性,c一致性,i隔離性,d永續性

19.3.1 原子性

事務佇列中的命令要麼都執行,要麼都不執行。這中間會存在某條命令執行出錯的情況,redis的事務不支援回滾,命令執行出錯依然繼續執行後續的命令

19.3.2 一致性   

事務執行前後,資料庫狀態都是一致的。一致是指,資料庫中沒有非法或者無效的錯誤資料。可能存在的錯誤如下

入隊錯誤:命令格式錯誤或者命令的執行函式不存在,會拒絕執行整個事務

執行錯誤:執行出錯會有相應的錯誤處理,不會修改資料庫

伺服器停機:如果有持久化操作,還原之後不會存在錯誤資料,如果沒有,空白的資料庫也不存在錯誤資料

19.3.3 隔離性

多個時間的執行不會相互干擾,因為redis使用單執行緒的方式執行事務,執行事務期間不會中斷,即redis中的事務均是以序列的方式執行

19.3.4 永續性單個伺服器可以處理多個客戶端的請求,中間的處理過程可能是交替執行的,某個客戶端想要自己的命令被連續執行,則需要開啟事務

第十九章 19 1 1節練習

練習19.1 使用malloc編寫你自己的operator new size t 函式,使用free編寫operator delete void 函式。解答 這個也就參考書中實現吧。不過這裡我更傾向於使用模板來實現,不把new的引數寫死。練習19.2 預設情況下,allocator類使用operat...

第十九章 19 2 1節練習

練習19.3 已知存在如下的類繼承體系,其中每個類分別定義了乙個公有的預設建構函式和乙個虛析構函式 class a class b public a class c public b class d public b,public a 下面的哪個dynamic cast將失敗?a a pa new ...

第十九章 收服蟻獸

第十九章 收服蟻獸 傲天還是一臉的費解,不可思議地看著不斷顫抖變小的蟻獸,同時感覺眉心胎記的位置越來越熱,而在其父的紫眸中則是另外一番景象,只見傲天眉心胎記處的那根線條隨著蟻獸體型越來越小也變得越來越黑,而且是越靠近蟻獸的地方越是顏色越深,並且緩緩地向回拉動,而蟻獸在收縮到 拳頭大小時則慢慢公升空向...