redis數據庫
- 默認16個數據庫,每一個數據庫由一個redis.h/redisDb結構表示,此結構裏的dict字典與expires字典,其中dict保存了該庫全部鍵值對,此字典即爲鍵空間;expires字典保存了數據庫中全部鍵的過時時間,該字典的鍵爲指向鍵空間中的某鍵對象,值爲long long 類型的整數表示的過時unix時間戳。
- 對鍵空間進行操做時還有額外的一些操做:
- 更新命中或不命中次數;
- 更新LRU(最後一次使用)時間;
- 判斷鍵是否過時,若過時則先刪除此鍵而後在執行其餘操做;
- 若是有watch命令監視此鍵,則將此鍵標識爲dirty讓應用程序注意到;
- 修改鍵對dirty計數器+1以觸發持久化及複製操做;
- 發送可能的數據庫通知
- redis使用惰性刪除與按期刪除配合策略
- 惰性刪除:只在取鍵是判斷是否刪除,對CPU友好對內存不友好;
- 按期刪除:每隔必定時間執行一次,且限制執行的時長和頻率,屢次遍歷各庫,隨機檢查過時時間並刪除
- RDB持久化模式對過時的鍵處理:
- 生成rdb文件時已過時的鍵不會保存到文件裏;
- 載入時若是當前服務器已主服務器模式運行,則忽略過時鍵,若是從服務器模式則不論過時都載入而後等待與主服務器同步到已過時的鍵。
- AOF持久化模式對過時鍵的處理:
- 只有在過時鍵被惰性刪除或按期刪除後纔會在AOF文件裏追加一條DEL記錄;
- AOF重寫與生成RDB文件類型,過時鍵不會報錯到重寫後的AOF文件中
- 複製模式下主服務器經過發送DEL命令控制從服務器的過時鍵刪除,從服務不去判斷是否過時或是否應刪除。
- redis2.8版本支持兩種數據庫通知:
- 鍵空間通知:即通知某個鍵都執行了哪些命令;
- 鍵時間通知:即通知某個命令被哪些鍵執行了。
以上文字來自Dimmacro,轉載請說明來源:http://www.cnblogs.com/dimmacro/ redis
RDB持久化:保存數據庫中某個時間點的鍵值對
- SAVE和BGSAVE命令均可以生成二進制RDB文件到磁盤,只是SAVE命令會在建立文件過程當中一直阻塞,期間不能處理任何客戶端的命令請求,而BGSAVE會fork一個子進程,不影響主進程接收並執行命令;
- redis服務器在啓動時會先看AOF是否開啓,優先使用AOF文件來還原數據庫狀態,只用AOF關閉纔會載入RDB文件;服務器在載入RDB文件期間會一致處於阻塞狀態直到完成;
- SAVE、BGSAVE、BGWRITEOF三個命令不會同時執行;
- 對於BGSAVE,因爲服務器記錄上距上次成功SAVE或BGSAVE後全部數據庫狀態已被修改的次數以及上次的時間點,因此用戶能夠經過save 時間段 修改次數 的命令形式來設置自動觸發BGSAVE,如save 60 1000 表示60秒內超過1000次的修改就須要觸發一次BGSAVE。
- RDB文件內部各內容結構圖:
![](http://static.javashuo.com/static/loading.gif)
AOF持久化:保存服務器所執行的寫命令
- AOF打開後服務器執行完一個寫命令,會以協議格式將此寫命令寫到aof_buf緩衝區末尾,每一個事件處理完後根據不一樣的appendfsync策略進行寫入與同步aof文件:
- always:將aof_buf內的全部內容寫入並同步aof文件;
- everysec:將aof_buf內的全部內容寫入aof文件,並由一個專門的線程檢查距離上次同步aof是否超過1秒,超過則同步本次內容到aof文件,默認的方式;
- no:將aof_buf內的全部內容寫入aof文件,但由操做系統來決定什麼時候同步
- aof重寫經過讀取數據庫中當前的鍵值對來從新生成aof文件,達到合併多條寫命令來減少aof文件的體積的目的,並非對現有的aof文件進行任何讀取,分析或者寫入操做。
- aof重寫的過程以下:
- 主進程fork出一個子進程來進行重寫,重寫期間主進程的新的寫命令會寫到aof重寫緩衝區;
- 子進程完成重寫後會發送一個信號給主進程通知重寫完成;
- 主進程將aof重寫緩衝區中新的寫命令繼續寫入到新aof文件,並將新aof文件更名,原子的覆蓋現有的aof文件,實現新舊aof文件的替換;
以上文字來自Dimmacro,轉載請說明來源:http://www.cnblogs.com/dimmacro/ 數據庫