標籤:
一、 交易處理
Redis對事務的支援比較簡單,或者說它的事務是有缺陷的。它只能保證一個Client發起的事務中的命令可以連續執行,中間不會插入其它client端的命令。缺陷在於,如果一個client將兩條命令放到一個事務了,執行的時候第二條命令發送錯誤,但此時Redis的事務不會復原第一條命令。如:
Redis事務的執行原理如下:當client端發起multi命令時,這個串連會進入一個事務上下文,該串連後續的命令不會立即執行,而是先放到一個緩衝隊列中,當執行exec命令時,Redis會依次執行隊列中所有命令。
1.1 開啟/執行事務(multi/exec)
1.2 取消事務(discard)
1.3 樂觀鎖
大多數是基於教據版本(version)的記錄機制實現的。即為資料增加一個版本標識,在基於資料庫表的版本解決方案中,一般是通過為資料庫表添加一個” version”欄位來實現讀取出資料時,將此版本號碼一同讀出,之後更新時,對此版本號碼加1。此時,將提交資料的版本號碼與資料庫表對應記錄的目前的版本號進行比對,如果提交的資料版本號碼大於資料庫目前的版本號,則予以更新,否則認為是到期資料。
舉例:
假設有一個age的key,我們開兩個Session對age進行賦值操作,然後看一下結果。
watch命令會監視給定的key,當exec時候,如果監視的key從調用watch後發生過變化,則整個事務會失敗。也可以調用watch多次監視多個key.這樣就可以對指定的key加樂觀鎖了。注意watch的key是對整個串連有效,事務也一樣。如果串連斷開,監視和事務都會被自動清除。當然了exec,discard,unwatch命令都會清除串連中的所有監視。
二、 持久化機制
Redis是一個支援持久化的記憶體資料庫,也就是說redis需要經常將記憶體中的資料同步到硬碟來保證持久化。Redis支援兩種持久化方案:
2.1 snapshotting(快照—存資料—預設)
快照是預設的持久化方式。這種方式是將記憶體中資料以快照的方式寫入到二進位檔案中,預設的檔案名稱為dump.rdb。可以通過配置設定自動做快照持久化的方式。我們可以配置Redis在n秒內如果超過m個key被修改就自動做快照。如:
2.2 aof(存操作)
由於快照方式是在一定間隔時間做一次的,所以如果Redis被意外down掉的話,就會丟失最後一次快照後的所有修改。aof方式比快照方式有更好的持久化性,是由於在使用aof時,Redis會將每一個收到的寫命令都通過write函數追加到檔案中,當Redis重啟時會通過重新執行檔案中儲存的寫命令來在記憶體中重建整個資料庫的內容。
當然由於os會在核心中緩衝write做的修改,所以可能不是立即寫到磁碟上.這樣aof仿式的持久化也還是有可能會丟失部分修改.我們可以通過設定檔告訴Redis我們想要通過fsync涵數強制os寫入到磁碟的時機。如:
我們查看appendonly.aof檔案可以看到,裡面存的都是Redis的操作:
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Redis——事務&持久化