溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Redis的慢日志相關(guān)底層原理

發(fā)布時(shí)間:2021-08-31 17:56:01 來(lái)源:億速云 閱讀:167 作者:chen 欄目:數(shù)據(jù)庫(kù)

這篇文章主要講解了“Redis的慢日志相關(guān)底層原理”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Redis的慢日志相關(guān)底層原理”吧!

 01、前言

相信很多小伙伴在使用 Redis 的時(shí)候都知道 Redis 有相關(guān)慢日志的查詢功能,并且多多少少都看過(guò)。那 Redis  底層到底是如果創(chuàng)建慢日志以及慢日志的結(jié)構(gòu)是什么樣子的呢?這篇文章就帶大家認(rèn)識(shí)一下。我們先看一張慢日志的截圖

Redis的慢日志相關(guān)底層原理

使用slowlog get  2命令查看最近的兩條慢日志信息,如上圖,我們可以看到每條日志中包含的信息有六個(gè)部分組成,從上到下編號(hào)為 0-5,依次代表的意思是

0:日志的唯一編號(hào) ID

1:命令執(zhí)行的當(dāng)前時(shí)間戳

2:命令執(zhí)行的耗時(shí)時(shí)長(zhǎng),單位微妙

3:具體的執(zhí)行命令和參數(shù)

4:客戶端的 ip 和端口(4.0 版本以上才支持)

5:客戶端名稱(4.0 版本以上支持)

如上圖所示,第一條慢日志的 ID 是 41,命令執(zhí)行的時(shí)間戳是 1575729996,并且執(zhí)行了 16129 微妙,具體執(zhí)行的命令就是slowlog  get,ip 和端口是27.38.56.88:8223,客戶端的名稱沒(méi)有設(shè)置。

02、慢日志命令設(shè)置

查看命令

上面我們已經(jīng)大概的知道的一條慢日志的格式,自然的我們可以想到的問(wèn)題是一個(gè)命令執(zhí)行多長(zhǎng)時(shí)間,我們就可以認(rèn)為是慢查詢,以及慢日志最多能保存多少條。

我們可以通過(guò)config get slowlog-log-slower-than 命令來(lái)查看 Redis 的時(shí)長(zhǎng)設(shè)置,以及通過(guò)config get  slowlog-max-len 來(lái)查看最大慢日志條數(shù)。如下圖。

Redis的慢日志相關(guān)底層原理

設(shè)置命令

上面我們使用config get 命令查看了時(shí)長(zhǎng)設(shè)置和條數(shù)設(shè)置,相反的我們可以用config  set來(lái)設(shè)置相關(guān)參數(shù),如下圖,我們先查看一下配置,然后再通過(guò)config set slowlog-log-slower-than 1000 命令和 config  set slowlog-max-len 64 命令來(lái)設(shè)置具體的值:

Redis的慢日志相關(guān)底層原理

通過(guò)上面的操作我們可以看到相關(guān)的配置已經(jīng)更改生效了。

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. slowlog-log-slower-than:這個(gè)參數(shù)的意思是任何命令執(zhí)行超過(guò)這個(gè)時(shí)間就會(huì)被記錄為慢日志,單位是微秒。

  3. slowlog-max-len:這個(gè)參數(shù)表示記錄的慢日志的最大條數(shù),設(shè)置了這個(gè)值過(guò)后,新的日志加進(jìn)來(lái),ID 最小的日志就會(huì)被刪除。

為了驗(yàn)證上面的第二點(diǎn),我這邊將slowlog-log-slower-than設(shè)置為 10 微秒,slowlog-max-len 設(shè)置為 5  條來(lái)進(jìn)行試驗(yàn),首先第一次使用slowlog get命令查詢的時(shí)候 5 條慢日志的編號(hào)是從 83-87,

Redis的慢日志相關(guān)底層原理

再次使用slowlog get命令查詢的編號(hào)結(jié)果是84-88,說(shuō)明 ID 為 83 的那一條已經(jīng)被刪除了。

Redis的慢日志相關(guān)底層原理

03、慢日志的存儲(chǔ)原理

存儲(chǔ)結(jié)構(gòu)

struct redisServer { long long slowlog_entry_id;//下一條慢查詢?nèi)罩镜?nbsp;ID list *slowlog;//保存了所有慢查詢?nèi)罩镜逆湵?nbsp;long long slowlog_log_slower_than;//服務(wù)器配置 slowlog-log-slower-than 選項(xiàng)的值 unsigned long slowlog_max_len;//服務(wù)器配置的 slowlog-max-len 的值 }
  • 在 Redis 的服務(wù)器狀態(tài)中保存了慢日志的相關(guān)屬性slowlog_entry_id 屬性的初始值是 0 每創(chuàng)建一條慢日志的時(shí)候就會(huì)增加 1。

  • slowlog 鏈表里面存儲(chǔ)了所有的慢日志,鏈表是由slowlogEntry結(jié)構(gòu)組成的,每個(gè)slowlogEntry代表一條慢日志。

  • slowlog_log_slower_than 和 slowlog_max_len 是前面服務(wù)器配置的相關(guān)參數(shù)。

slowlog 鏈表

typedef struct slowlogEntry {     long long id;//唯一標(biāo)識(shí)符     time_t time; //命令執(zhí)行的時(shí)間,格式為 unix 時(shí)間戳     long long duration;//命令消耗的時(shí)間,以微秒為單位     robj **argv;//命令與命令參數(shù)     int argc; //命令與命令參數(shù)個(gè)數(shù) } slowlogEntry;

Redis的慢日志相關(guān)底層原理

image-20191211220858341

slowlogEntry 實(shí)體的相關(guān)字段含義如下:

  • id: 標(biāo)識(shí)慢日志的唯一 ID

  • time: 命令執(zhí)行的時(shí)間戳

  • duration: 命令執(zhí)行是耗時(shí),單位為微妙

  • agrv: 命令和參數(shù)數(shù)組

  • argc: 命令和參數(shù)的個(gè)數(shù)

如上圖就表示了在執(zhí)行命令set number 520 發(fā)生了慢日志,命令執(zhí)行耗時(shí) 10 微秒。

04、操作慢日志

知道了慢日志的存儲(chǔ)結(jié)構(gòu),我們就需要考慮在執(zhí)行命令的時(shí)候,如何根據(jù)條件去創(chuàng)建慢日志。

首先我們需要在命令的執(zhí)行前后記錄時(shí)間戳,然后相減計(jì)算出命令的執(zhí)行耗時(shí),然后根據(jù) Redis 服務(wù)器配置slowlog-log-slower-than  進(jìn)行對(duì)比,決定是否記錄慢日志,另外在記錄慢日志的時(shí)候需要根據(jù)slowlog_max_len 值判斷是否要?jiǎng)h除最久的日志信息。偽代碼如下:

//1. 記錄命令執(zhí)行前的時(shí)間戳 long before = now(); //2. 執(zhí)行命令 execute(argv, argc); //3. 記錄命令執(zhí)行后的時(shí)間戳 long after = now(); //4. 調(diào)用創(chuàng)建慢日志函數(shù) slowlogPushEntryIfNeed(argv, argc, after - before);

slowlogPushEntryIfNeed 函數(shù)主要用來(lái)判斷是否插入數(shù)據(jù),以及是否刪除舊數(shù)據(jù)。

void slowlogPushEntryIfNeed(robj **argv, int argc, long long duration) { //1. 判斷是否開(kāi)啟慢日志 if (server.slowlog_log_slower_than < 0) return; //2. 如果超時(shí),則插入慢日志   if (duraton > server.slowlog_log_slower_than){     //插入   }   while (listLength(server.slowlog) > server.slowlog_max_len) {     //刪除   } }

我們先判斷服務(wù)器是否配置了超時(shí)參數(shù),如果超時(shí)參數(shù)小于 0  則直接返回,否則再比較命令執(zhí)行時(shí)間是否超時(shí),如果超時(shí)則插入慢日志;最后在比較慢日志的條數(shù)是否達(dá)到上限,如果達(dá)到則進(jìn)行刪除。

感謝各位的閱讀,以上就是“Redis的慢日志相關(guān)底層原理”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Redis的慢日志相關(guān)底層原理這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI