深刻理解Redis、服務器屬性

服務器相關屬性在服務器運行過程當中扮演着重要的角色,他們會與服務器相關函數結合起來,共同維護服務器的正常運行。如下是服務器相關屬性的具體描述。數據庫

cronloops

cronloops 屬性是一個計數器,用於記錄服務器的 serverCron 函數被執行的次數,是一個 int 類型的整數。每執行一次serverCron函數,cronloops屬性的值就加1。後端

serverCron函數是Redis服務器中的一個重要函數,默認狀況下,每隔100毫米就執行一次,它負責管理服務器的資源,並維持服務器的正常運行。緩存

db_child_pid 與 aof_child_pid

rdb_child_pid 和 aof_child_pid 屬性用於檢查 Redis 服務器持久化操做的運行狀態,它們記錄執行 BGSAVE 和 BGREWRITEAOF 命令的子進程的 ID。也經常使用這兩個屬性來判斷 BGSAVE 和 BGREWRITEAOF 命令是否正在被執行。服務器

(BGSAVE用於Redis服務後端採用異步的方式將數據保存到當前數據庫的磁盤中,在執行命令後會返回OK,以後Redis啓動一個新的子進程,原來的Redis進程(父進程)繼續執行客戶端請求命令,而子進程負責將數據保存到磁盤中,而後退出。異步

BGREWRITEAOF命令用於執行一個AOF文件的重寫操做)ide

當執行 serverCron 函數時,會檢查 rdb_child_pid 和 aof_child_pid 屬性的值,只要其中一個屬性的值不等於-1,程序就會調用一次 wait3 函數來判斷子進程是否發送信號到服務器中。若是沒有信號到達,則表示服務器持久化操做沒有完成,程序不作任何處理。而若是有信號到達,那麼,針對 BGSAVE 命令,表示新的 RDB 文件已經成功生成,針對 BGREWRITEAOF 命令,表示新的 AOF 文件生成完畢,而後服務器繼續執行相應的後續操做。好比,將舊的 RDB 文件或 AOF 文件替換爲新的 RDB 文件或 AOF 文件。函數

另外,當 rdb_child_pid 和 aof_child_pid 屬性的值都爲-1 時,表示此時的服務器沒有執行持久化操做,這時程序會作出以下判斷。oop

(1)判斷 BGREWRITEAOF 命令的執行是否被延遲了,若是被延遲了,則從新執行一次 BGREWRITEAOF 命令。spa

(2)判斷是否知足服務器的自動保存條件。若是知足服務器的自動保存條件,而且服務器沒有執行其餘持久化操做,那麼服務器將開始執行 BGSAVE 命令。unix

(3)判斷是否知足服務器設置的 AOF 重寫條件。若是條件知足,同時服務器沒有執行其餘持久化操做,那麼服務器將從新執行 BGREWRITEAOF 命令。

stat_peak_memory

stat_peak_memory 屬性用於記錄Redis服務器的內存峯值大小,在每次執行serverCron函數時,程序都會檢查服務器當前內存的使用狀況,並與stat_peak_memory屬性保存的上一次內存峯值大小進行比較,若是當前的內存峯值大小大於stat_peak_memory屬性保存的值,就將當前最新的內存峯值大小賦給stat_peak_memory屬性。

在執行info memory命令後,返回的used_memory和used_memory_human屬性分別以兩種格式記錄了服務器的內存峯值大小。圖片

lruclock

lruclock 屬性是一種服務器時間緩存,它記錄了服務器的 LRU 時鐘。在默認狀況下,serverCron 函數會以每 10 秒一次的頻率更新 lruclock 屬性的值。LRU 時鐘不是實時的,它只是一個模糊的估計值。Redis 的每一個對象都有一個 lru 屬性,該屬性記錄了這個對象最後一次被命令訪問的時間。使用 lruclock 屬性的值減去 lru 屬性的值,就能計算出這個對象的空轉時間。

可使用 INFO server 命令的 lru_clock 屬性來查看當前 LRU 時鐘的時間圖片

mstime 與 unixtime

mstime 和 unixtime 屬性記錄了服務器當前的時間。在默認狀況下,serverCron 函數會以每 100 毫秒一次的頻率更新 mstime 和 unixtime 屬性,它們記錄的時間值並非最準確的。

aof_rewrite_scheduled

aof_rewrite_scheduled 屬性用於記錄服務器中 BGREWRITEAOF 命令執行是否被延遲。當 aof_rewrite_scheduled 屬性的值爲 1 時,表示執行 BGREWRITEAOF 命令超時了。

在服務器執行 BGSAVE 命令時,若是客戶端發送了 BGREWRITEAOF 命令請求,那麼服務器在接收到命令請求以後,會將 BGREWRITEAOF 命令延遲到 BGSAVE 命令執行成功後再執行。

在每次執行serverCron函數時,都會判斷BGSAVE和BGREWRITEAOF命令是否正在被執行,若是他們沒有被執行,同時aof_rewrite_scheduled屬性值爲1,那麼被延遲的BGREWRITEAOF命令將會被執行。

相關文章
相關標籤/搜索