您好,登錄后才能下訂單哦!
這篇文章主要講解了“Redis的慢日志相關底層原理”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Redis的慢日志相關底層原理”吧!
相信很多小伙伴在使用 Redis 的時候都知道 Redis 有相關慢日志的查詢功能,并且多多少少都看過。那 Redis 底層到底是如果創建慢日志以及慢日志的結構是什么樣子的呢?這篇文章就帶大家認識一下。我們先看一張慢日志的截圖
使用slowlog get 2命令查看最近的兩條慢日志信息,如上圖,我們可以看到每條日志中包含的信息有六個部分組成,從上到下編號為 0-5,依次代表的意思是
0:日志的唯一編號 ID
1:命令執行的當前時間戳
2:命令執行的耗時時長,單位微妙
3:具體的執行命令和參數
4:客戶端的 ip 和端口(4.0 版本以上才支持)
5:客戶端名稱(4.0 版本以上支持)
如上圖所示,第一條慢日志的 ID 是 41,命令執行的時間戳是 1575729996,并且執行了 16129 微妙,具體執行的命令就是slowlog get,ip 和端口是27.38.56.88:8223,客戶端的名稱沒有設置。
查看命令
上面我們已經大概的知道的一條慢日志的格式,自然的我們可以想到的問題是一個命令執行多長時間,我們就可以認為是慢查詢,以及慢日志最多能保存多少條。
我們可以通過config get slowlog-log-slower-than 命令來查看 Redis 的時長設置,以及通過config get slowlog-max-len 來查看最大慢日志條數。如下圖。
設置命令
上面我們使用config get 命令查看了時長設置和條數設置,相反的我們可以用config set來設置相關參數,如下圖,我們先查看一下配置,然后再通過config set slowlog-log-slower-than 1000 命令和 config set slowlog-max-len 64 命令來設置具體的值:
通過上面的操作我們可以看到相關的配置已經更改生效了。
鴻蒙官方戰略合作共建——HarmonyOS技術社區
slowlog-log-slower-than:這個參數的意思是任何命令執行超過這個時間就會被記錄為慢日志,單位是微秒。
slowlog-max-len:這個參數表示記錄的慢日志的最大條數,設置了這個值過后,新的日志加進來,ID 最小的日志就會被刪除。
為了驗證上面的第二點,我這邊將slowlog-log-slower-than設置為 10 微秒,slowlog-max-len 設置為 5 條來進行試驗,首先第一次使用slowlog get命令查詢的時候 5 條慢日志的編號是從 83-87,
再次使用slowlog get命令查詢的編號結果是84-88,說明 ID 為 83 的那一條已經被刪除了。
存儲結構
struct redisServer { long long slowlog_entry_id;//下一條慢查詢日志的 ID list *slowlog;//保存了所有慢查詢日志的鏈表 long long slowlog_log_slower_than;//服務器配置 slowlog-log-slower-than 選項的值 unsigned long slowlog_max_len;//服務器配置的 slowlog-max-len 的值 }
在 Redis 的服務器狀態中保存了慢日志的相關屬性slowlog_entry_id 屬性的初始值是 0 每創建一條慢日志的時候就會增加 1。
slowlog 鏈表里面存儲了所有的慢日志,鏈表是由slowlogEntry結構組成的,每個slowlogEntry代表一條慢日志。
slowlog_log_slower_than 和 slowlog_max_len 是前面服務器配置的相關參數。
slowlog 鏈表
typedef struct slowlogEntry { long long id;//唯一標識符 time_t time; //命令執行的時間,格式為 unix 時間戳 long long duration;//命令消耗的時間,以微秒為單位 robj **argv;//命令與命令參數 int argc; //命令與命令參數個數 } slowlogEntry;
image-20191211220858341
slowlogEntry 實體的相關字段含義如下:
id: 標識慢日志的唯一 ID
time: 命令執行的時間戳
duration: 命令執行是耗時,單位為微妙
agrv: 命令和參數數組
argc: 命令和參數的個數
如上圖就表示了在執行命令set number 520 發生了慢日志,命令執行耗時 10 微秒。
知道了慢日志的存儲結構,我們就需要考慮在執行命令的時候,如何根據條件去創建慢日志。
首先我們需要在命令的執行前后記錄時間戳,然后相減計算出命令的執行耗時,然后根據 Redis 服務器配置slowlog-log-slower-than 進行對比,決定是否記錄慢日志,另外在記錄慢日志的時候需要根據slowlog_max_len 值判斷是否要刪除最久的日志信息。偽代碼如下:
//1. 記錄命令執行前的時間戳 long before = now(); //2. 執行命令 execute(argv, argc); //3. 記錄命令執行后的時間戳 long after = now(); //4. 調用創建慢日志函數 slowlogPushEntryIfNeed(argv, argc, after - before);
slowlogPushEntryIfNeed 函數主要用來判斷是否插入數據,以及是否刪除舊數據。
void slowlogPushEntryIfNeed(robj **argv, int argc, long long duration) { //1. 判斷是否開啟慢日志 if (server.slowlog_log_slower_than < 0) return; //2. 如果超時,則插入慢日志 if (duraton > server.slowlog_log_slower_than){ //插入 } while (listLength(server.slowlog) > server.slowlog_max_len) { //刪除 } }
我們先判斷服務器是否配置了超時參數,如果超時參數小于 0 則直接返回,否則再比較命令執行時間是否超時,如果超時則插入慢日志;最后在比較慢日志的條數是否達到上限,如果達到則進行刪除。
感謝各位的閱讀,以上就是“Redis的慢日志相關底層原理”的內容了,經過本文的學習后,相信大家對Redis的慢日志相關底層原理這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。