中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis的慢日志相關底層原理

發布時間:2021-08-31 17:56:01 來源:億速云 閱讀:169 作者:chen 欄目:數據庫

這篇文章主要講解了“Redis的慢日志相關底層原理”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Redis的慢日志相關底層原理”吧!

 01、前言

相信很多小伙伴在使用 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,客戶端的名稱沒有設置。

02、慢日志命令設置

查看命令

上面我們已經大概的知道的一條慢日志的格式,自然的我們可以想到的問題是一個命令執行多長時間,我們就可以認為是慢查詢,以及慢日志最多能保存多少條。

我們可以通過config get slowlog-log-slower-than 命令來查看 Redis 的時長設置,以及通過config get  slowlog-max-len 來查看最大慢日志條數。如下圖。

Redis的慢日志相關底層原理

設置命令

上面我們使用config get 命令查看了時長設置和條數設置,相反的我們可以用config  set來設置相關參數,如下圖,我們先查看一下配置,然后再通過config set slowlog-log-slower-than 1000 命令和 config  set slowlog-max-len 64 命令來設置具體的值:

Redis的慢日志相關底層原理

通過上面的操作我們可以看到相關的配置已經更改生效了。

  1. 鴻蒙官方戰略合作共建——HarmonyOS技術社區

  2. slowlog-log-slower-than:這個參數的意思是任何命令執行超過這個時間就會被記錄為慢日志,單位是微秒。

  3. slowlog-max-len:這個參數表示記錄的慢日志的最大條數,設置了這個值過后,新的日志加進來,ID 最小的日志就會被刪除。

為了驗證上面的第二點,我這邊將slowlog-log-slower-than設置為 10 微秒,slowlog-max-len 設置為 5  條來進行試驗,首先第一次使用slowlog get命令查詢的時候 5 條慢日志的編號是從 83-87,

Redis的慢日志相關底層原理

再次使用slowlog get命令查詢的編號結果是84-88,說明 ID 為 83 的那一條已經被刪除了。

Redis的慢日志相關底層原理

03、慢日志的存儲原理

存儲結構

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;

Redis的慢日志相關底層原理

image-20191211220858341

slowlogEntry 實體的相關字段含義如下:

  • id: 標識慢日志的唯一 ID

  • time: 命令執行的時間戳

  • duration: 命令執行是耗時,單位為微妙

  • agrv: 命令和參數數組

  • argc: 命令和參數的個數

如上圖就表示了在執行命令set number 520 發生了慢日志,命令執行耗時 10 微秒。

04、操作慢日志

知道了慢日志的存儲結構,我們就需要考慮在執行命令的時候,如何根據條件去創建慢日志。

首先我們需要在命令的執行前后記錄時間戳,然后相減計算出命令的執行耗時,然后根據 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的慢日志相關底層原理這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

昌邑市| 黎平县| 洛扎县| 军事| 长沙市| 合阳县| 齐河县| 汕头市| 福安市| 永福县| 遂昌县| 宁城县| 陆河县| 沈阳市| 白玉县| 肃南| 谢通门县| 涪陵区| 杭锦后旗| 滁州市| 柘荣县| 互助| 邳州市| 封开县| 通化县| 泗阳县| 阳新县| 文安县| 高阳县| 九龙县| 云和县| 阿拉尔市| 阿坝县| 长岛县| 武鸣县| 重庆市| 永福县| 凤山县| 万荣县| 南澳县| 广宗县|