咱們都知道Redis是基於內存的數據庫,數據是以key-value鍵值對的方式存儲的,那麼key-value鍵值對是隨意放在內存中的麼,其實Redis的服務會建立不少的數據庫空間,這些key-value鍵值對都是在各個數據庫空間中存儲的。redis
當咱們使用客戶端工具連接Redis服務時,會在客戶端中看到一系列的db*命名的項(如圖),這些就是一個個數據庫,Redis初始化建立16個數據庫,數據庫建立個數能夠在配置文件中修改。數據庫
而在命令行模式中是看不到這些數據庫的具體數量的,但在命令行提示符的右側會提示咱們當前處於哪一個數據庫(如圖),而且能夠用上一章說到的SELECT命令進行數據庫的切換;客戶端默認鏈接第一個數據庫,即0號數據庫。安全
(1)數據庫鍵空間服務器
key-value鍵值對存儲在各個數據庫中,而每一個數據庫內部都是由一個redisDb結構,結構中有若干個屬性,最主要的有兩個屬性dict、expires。網絡
1 typedef struct redisDb { 2 // ... 3 // 數據庫鍵空間,保存着數據庫中的全部鍵值對 4 dict *dict; 5 6 // 過時字典,保存着鍵的過時時間 7 dict *expires; 8 // ... 9 } redisDb;
圖中是帶有過時字典的數據庫例子數據結構
(2)持久化併發
上面說道的不管是數據庫仍是期內的數據都是存儲在服務器內內存中的,若是服務器一旦發生掉電,進程退出等狀況,那麼其內存中的數據就都消失不見了,在咱們大規模併發的項目下,顯然這是災難性的,因此應對這種狀況的辦法之一,就是持久化,把內存中的數放到磁盤中,意外發生後,可以從磁盤上進行數據恢復到內存中,這樣就避免了數據丟失。異步
Redis提供了兩種持久化方式RDB持久化和AOF持久化。工具
RDB持久化是最直接的持久化方式,直接將內存中的數據保存到RDB文件中,當恢復時也是直接從RDB文件中恢復;spa
自動間隔性保存
由於BGSAVE命令是異步執行,不會阻塞服務器,因此Redis容許用戶自行配置SAVE選項,當選項觸發時自動執行BGSAVE命令。
當用戶開啓了觸發自動BGSAVE後,若是不配置save選項,服務器會使用默認設置,以下:
(1)在900秒內,對數據庫進行了至少1次修改。
(2)在300秒內,對數據庫進行了至少10次修改。
(3)在60秒內,對數據庫進行了至少10000次修改。
以上三個條件,知足任意一條,就會進行BGSAVE操做
AOF持久化與RDB不一樣,AOF持久化是經過記錄服務器所執行的命令來保存數據的。
AOF文件的載入與還原
AOF持久化的數據還原過程就是讀取AOF中命令從新執行命令的過程。
(1)Redis會建立一個僞客戶端,僞客戶端與真實的客戶端執行命令的效果是同樣的,只是不帶網絡鏈接。
(2)從AOF文件分析並讀取一條命令。
(3)僞客戶端執行這條命令。
(4)重複2和3過程,知道AOF文件中的全部命令處理完成。
AOF文件重寫
AOF文件的持久化是記錄被執行對的命令,這樣隨着時間愈來愈長,AOF文件中的內容會愈來愈多,體積也會愈來愈大,文件越大恢復數據的時間也越多。
在命令執行的過程當中有些鍵值對被刪除了,有些被修改了,而這些過程命令是徹底沒有必要再執行一遍的,因此Redis提供了AOF文件的重寫功能對AOF進行重建,使用重建後的文件要比元AOF文件體積小不少。
參考:
《Redis設計與實現》黃健宏著,網上對Redis的詳解等
此博客爲筆者使用redis好久以後,參考網絡上各種文章總結性書寫,原創手打,若有錯誤歡迎指正。