Redis 事務 持久化

2021-07-04 06:06:14 字數 1842 閱讀 8365

redis對事務的支援比較簡單,或者說它的事務是有缺陷的。它只能保證乙個client發起的事務中的命令可以連續執行,中間不會插入其它client端的命令。缺陷在於,如果乙個client將兩條命令放到乙個事務了,執行的時候第二條命令傳送錯誤,但此時redis的事務不會回滾第一條命令。如下圖:

redis事務的執行原理如下:當client端發起multi命令時,這個連線會進入乙個事務上下文,該連線後續的命令不會立即執行,而是先放到乙個緩衝佇列中,當執行exec命令時,redis會依次執行佇列中所有命令。

大多數是基於教據版本(version)的記錄機制實現的。即為資料增加乙個版本標識,在基於資料庫表的版本解決方案中,一般是通過為資料庫表新增乙個」 version」欄位來實現讀取出資料時,將此版本號一同讀出,之後更新時,對此版本號加1。此時,將提交資料的版本號與資料庫表對應記錄的當前版本號進行比對,如果提交的資料版本號大於資料庫當前版本號,則予以更新,否則認為是過期資料。

舉例:假設有乙個age的key,我們開兩個session對age進行賦值操作,然後看一下結果。

watch命令會監視給定的key,當exec時候,如果監視的key從呼叫watch後發生過變化,則整個事務會失敗。也可以呼叫watch多次監視多個key.這樣就可以對指定的key加樂觀鎖了。注意watch的key是對整個連線有效的,事務也一樣。如果連線斷開,監視和事務都會被自動清除。當然了exec,discard,unwatch命令都會清除連線中的所有監視。

redis是乙個支援持久化的記憶體資料庫,也就是說redis需要經常將記憶體中的資料同步到硬碟來保證持久化。redis支援兩種持久化方案:

快照是預設的持久化方式。這種方式是將記憶體中資料以快照的方式寫入到二進位制檔案中,預設的檔名為dump.rdb。可以通過配置設定自動做快照持久化的方式。我們可以配置redis在n秒內如果超過m個key被修改就自動做快照。如下圖:

由於快照方式是在一定間隔時間做一次的,所以如果redis被意外down掉的話,就會丟失最後一次快照後的所有修改。aof方式比快照方式有更好的持久化性,是由於在使用aof時,redis會將每乙個收到的寫命令都通過write函式追加到檔案中,當redis重啟時會通過重新執行檔案中儲存的寫命令來在記憶體中重建整個資料庫的內容。

當然由於os會在核心中快取write做的修改,所以可能不是立即寫到磁碟上.這樣aof仿式的持久化也還是有可能會丟失部分修改.我們可以通過配置檔案告訴redis我們想要通過fsync涵數強制os寫入到磁碟的時機。如下圖:

Redis 三 事務與持久化

redis 中的事務 transaction 是一組命令的集合,至少是兩個或兩個以上的命令,redis事務保證這些命令被執行時中間不會被任何其他操作打斷。事務執行 exec 之前,入隊命令錯誤 語法錯誤 嚴重錯誤導 致伺服器不能正常工作 例如記憶體不足 放棄事務。redis 的資料儲存在記憶體中,記...

redis持久化 AOF持久化

1.aof持久化原理 aof持久化會將被執行的寫命令寫到aof檔案的末尾。在恢復的時候,redis只要從頭到尾重新執行一次aof檔案包含的所有寫命令 2.配置選項 固態硬碟禁用always選項,在某些情況頻繁讀寫會大大降低固態硬碟的壽命 4.aof檔案的重寫和壓縮 aof檔案裡面記錄了所有的命令而不...

redis持久化之AOF持久化

aof與rdb持久化通過儲存資料庫中的鍵值對來記錄資料庫狀態不同,aof持久化是通過儲存redis伺服器所執行的寫命令來記錄資料庫狀態的。被寫入aof檔案的所有命令都是以redis的命令請求協議格式儲存的。當aof持久化功能處於開啟狀態,伺服器在執行完乙個寫命令之後,會以協議格式將被執行的寫命令追加...