基本全是參考http://blog.csdn.net/a600423444/article/details/8944601 redis的使用大家都很熟悉,可能除了watch 鎖,pipeline,訂閱發佈用的少點,不過網上也有大量的教材和例子,這裡想聊聊redis中的一些原理。 1.redis 提供 ...
基本全是參考http://blog.csdn.net/a600423444/article/details/8944601 redis的使用大家都很熟悉,可能除了watch 鎖,pipeline,訂閱發佈用的少點,不過網上也有大量的教材和例子,這裡想聊聊redis中的一些原理。 1.redis 提供了兩種持久化方式,一種是RDB,一種是AOF; RDB 是指在制定的時間間隔生成數據集的快照, AOF持久化記錄伺服器執行的所有寫命令,併在伺服器重啟時,重新執行這些命令來恢複數據 2.redis 啟動過程 -(1)初始化伺服器變數,設置伺服器預設配置 -(2)讀取配置文件的配置,覆蓋預設配置 -(3)初始化伺服器功能模塊 -(4)從RDB或者AOF中重載數據 -(5)網路監聽前的準備工作 -(6)開啟事件監聽,迴圈接受客戶端請求
3.redis持久化方案分析 (1)RDB持久化 將記憶體中的數據快照保持到磁碟中,redis重啟的時候重新載入RDB文件來還原資料庫。 a)RDB 保存 如果已經存在RDB文件,會用新文件替換舊文件, 在保存RDB的過程中,redis主進程阻塞,無法響應客戶端請求。 為了避免阻塞主線程,redis提供了rdbSaveBackground函數,新建子進程調用RDB save,完成RDB保存後再發生消息通知主進程。在此期間主進程可以繼續處理新的客戶端請求。 b)RDB讀取 redis啟動的時候會根據配置的持久化模式,決定是否讀取RDB文件,並將其保存到記憶體中。 在此過程中,每載入1000個key,就處理一次已經等待處理的客戶端請求,不過目前只能處理訂閱功能的命令, 其他一律返回錯誤信息。因為發佈訂閱功能不需要寫入數據,不需要保存在redis資料庫中 缺點: 1.保存頻率過低,宕機時會導致數據丟失 2.保存頻率過高,可能由於數據集過大導致操作耗時,短時間無法處理客戶端請求 (2)AOF持久化 將所有的寫命令記錄下來,達到記錄資料庫狀態的目的 a)保存 (1)將客戶端請求的命令轉化為網路協議格式 (2)將協議內容字元串追加到變數server.aof_buf 中 (3)當AOF系統達到設定的條件時,會調用aof_fsync將數據寫入磁碟 這裡的設定的條件,就是AOF性能的關鍵,其主要有3種類型 1.AOF_FSYNC_NO:不保存 該過程中命令只會追加到server.aof_buf中,但是不會執行寫入磁碟,當redis被正常關閉,AOF功能關閉,或者buf 緩存寫滿了,或者定時保存操作執行,這3種情況下都會阻塞主進程,導致客戶端請求失敗。 2.AOF_FSYNC_EVERYSECS 每秒保存一次 後臺子進程調用寫入保存,不會阻塞主進程,發送宕機最大丟失數據2s內 3.AOF_FSYNC_ALWAYS 沒執行一個命令保存一次 保證每條命令都保存,數據不丟失,但是會影響性能,因為每一次操作都會阻塞主進程 AOF提供了重寫機制,可以減少命令 4.redis rehash redis 的rehash機制和php的rehash機制不相同; php使用阻塞型rehash,在此期間不能對hash 表做任何操作,而redis不能,redis操作頻繁,對性能要求高。 redis 採用漸進式rehash方式 redis中會保存兩個hash數組,正常的操作只會針對h[0],h[1]做rehash之用; 在rehash過程中,所有的寫都切換到h[1],讀操作先針對h[0],都去不到再去都去h[1],