服務器數據庫
1. 一個命令請求從發送到完成主要包括如下步驟:緩存
1). 客戶端將命令請求發送給服務器安全
2). 服務器讀取命令請求,並分析出命令參數服務器
3). 命令執行器根據參數查找命令的實現函數,而後執行實現函數並得出命令回覆網絡
4). 服務器將命令回覆返回給客戶端數據結構
2. serverCron函數默認每隔100毫秒執行一次,它的工做主要包括更新服務器狀態信息,處理服務器接收的SIGTERM信號,管理客戶端資源和數據庫狀態,檢查並執行持久化操做等等。異步
3. 服務器從啓動到開始處理客戶端的命令請求須要執行如下步驟:函數
1). 初始化服務器狀態結構。爲結構中的各個屬性設置默認值。oop
2). 載入服務器配置選項。spa
3). 初始化服務器數據結構。包括建立共享對象(思想),如一些經常使用字符串("OK"等),整數1到10000的字符串對象等等。
4). 還原數據庫狀態,即載入RDB或者AOF文件。
5). 執行事件循環,開始接受客戶端的鏈接請求。
4. serverCron函數執行的主要操做:
1). 更新服務器時間緩存。每次獲取系統當前時間太耗資源,能夠將系統時間緩存起來。不重要的事件使用緩存時間,重要的事件依舊獲取當前系統時間。(思想)
2). 更新LRU時鐘。服務器時間緩存的一種。每一個Redis對象都有一個lru屬性,這個lru屬性保存了對象最後一次被命令訪問的時間。
3). 更新服務器每秒執行命令次數。能夠經過INFO stats 命令的instantaneous_ops_per_sec域查看。
4). 更新服務器內存峯值記錄。INFO memory命令的used_memory_peak和used_memory_peak_human兩個域分別以兩種格式記錄了服務器的內存峯值。
5). 處理SIGTERM信號。服務器關閉信號。接收到該信號後,服務器在關閉自身以前會進行RDB持久化操做。(思想)
6). 管理客戶端資源。關閉,從新分配輸入緩衝區等。
7). 管理數據庫資源。對服務器中的一部分數據庫進行檢查,刪除過時鍵,對字段進行收縮操做等。
8). 執行被延遲的BGREWRITEAOF。
9). 檢查持久化操做的運行狀態。檢查新的RDB文件是否新建完成,檢查是否知足AOF重寫條件等。
10). 將AOF緩衝區中的內容寫入AOF文件
11). 關閉異步客戶端。關閉那些輸出緩衝區大小超出限制的客戶端。
12). 增長cronloopse計數器的值。也便是serverCron函數執行的次數。
複製
1. Redis2.8之前的複製功能不能高效地處理斷線後重複製狀況,但Redis2.8新添加的部分重同步功能能夠解決這個問題。
2. 部分重同步經過複製偏移量、複製積壓緩衝區、服務器運行ID三個部分來實現。
3. 在複製操做剛開始的時候,從服務器會成爲主服務器的客戶端,並經過向主服務器發送命令請求來執行復制步驟,而在複製操做的後期,主從服務器會互相成爲對方的客戶端。
4. 主服務器經過向從服務器傳播命令來更新從服務器的狀態,保存主從服務器一致,而從服務器則經過向主服務器發送命令進行心跳檢測,以及命令丟失檢測。
5. 在Redis中,用戶能夠經過執行SLAVEOF命令或者設置slaveof選項,讓一個服務器(從服務器)去複製另外一個服務器(主服務器)。
6. 舊版複製功能的實現:
1). 同步
a. 從服務器向主服務器發送SYNC命令
b. 主服務器執行BGSAVE命令,後臺生成一個RDB文件,並使用緩存區記錄從如今開始執行的全部寫命令
c. 主服務器將RDB文件發送給從服務器,從服務器載入RDB文件
d. 主服務器將緩衝區的命令發送給從服務器
2). 命令傳播:爲了讓主從服務器一直保持一致狀態,主服務器須要對從服務器執行命令傳播操做:主服務器將本身執行的寫命令,發送給從服務器執行。
7. 舊版複製功能的缺陷: 斷線複製會從新複製主服務器中的全部內容。
8. 新版複製功能的實現,Redis從2.8版本開始,使用PSYNC命令代替SYNC命令來執行復制時的同步操做。PSYNC命令具備完整重同步和部分重同步兩種模式:
1). 完整重同步:執行的步驟和SYNC命令的執行步驟基本同樣。
2). 部分重同步:只同步斷開後的操做。
9. 部分重同步的實現:
1). 複製偏移量:主從服務器會分別維護一個複製偏移量。經過對比主從服務器的複製偏移量,程序能夠很容易地知道主從服務器是否處於一致狀態。
2). 複製積壓緩衝區 : 複製積壓緩衝區是由主服務器維護的一個固定長度先進先出隊列,默認大小爲1M。緩衝區裏面會保存着一部分最近傳播的寫命令,而且複製積壓緩衝區會爲隊列中
的每一個字節記錄相應的複製偏移量。
3). 服務器運行ID:初次鏈接時,主服務器會將運行ID傳給從服務器,從服務器將該ID保存起來。斷開重連時,根據此ID判斷以前是否有複製關係。
10. 正確估算和設置複製積壓緩衝區的大小很是重要。估算公式:second*write_size_per_second , second爲鏈接平均所需時間。write_size_per_second 表示主服務器每秒產生的
寫命令數據量。例如:每秒1M,5秒才能鏈接上,緩衝區大小就不能低於5M。安全起見能夠設置爲2倍。
11. PSYNC命令的實現:
PSYNC命令的調用方法有兩種:
1). PSYNC ? -1 : 以前沒有複製過
2). PSYNC <runid> <offset> , runid 主服務器運行ID , offset 偏移量
主服務器回覆:
1). 完整重同步
2). 部分同步
3). 識別不了PSYNC,Redis版本低於2.8
12. 複製的實現
1). 設置主服務器的地址和端口:SLAVEOF <master_ip> <master_port>
2). 創建套接字鏈接
3). 發送PING命令
4). 身份驗證
5). 發送端口信息,將從服務器監聽端口通知給主服務器。
6). 同步
7). 命令傳播
13. 心跳檢測,在命令傳播階段,從服務器默認會以每秒一次的頻率,向主服務器發送命令:REPLCONF ACK <replication_offset> (思想)
1). 檢測從服務器的網絡鏈接狀態
2). 輔助實現min-slaves配置選項。防止主服務器在不安全的狀況下執行寫命令。例如,咱們向主服務器提供如下設置:
min-slaves-to-write 3
min-slaves-max-lag 10
那麼在從服務器的數量少於3個,或者三個從服務器的延遲(lag)值都大於或等於10秒時,主服務器將拒絕執行寫命令。
3). 檢測命令丟失。經過比較偏移量,能夠檢測出網絡斷線時,丟失的數據。從新發送給從服務器。
14. REPLCONF ACK命令和複製積壓緩衝區都是Redis 2.8版本新增的,因此爲了保證複製時主從服務器的數據一致性,最好使用2.8或以上版本