久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Redis的慢日志相關底層原理

195次閱讀
沒有評論

共計 2831 個字符,預計需要花費 8 分鐘才能閱讀完成。

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

 01、前言

相信很多小伙伴在使用 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 來查看最大慢日志條數。如下圖。

設置命令

上面我們使用 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 的那一條已經被刪除了。

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;

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 的慢日志相關底層原理這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關知識點的文章,歡迎關注!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-28發表,共計2831字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 黄山市| 仪陇县| 广河县| 来凤县| 水富县| 灵山县| 怀远县| 平阳县| 新源县| 扎囊县| 南华县| 延寿县| 中西区| 嘉善县| 周至县| 子长县| 林西县| 偏关县| 昌黎县| 铁岭市| 丹江口市| 全州县| 宁津县| 高安市| 公安县| 诸城市| 五原县| 苗栗市| 石狮市| 商都县| 尖扎县| 信丰县| 兰坪| 紫金县| 莱阳市| 东乌| 彭泽县| 察雅县| 辽宁省| 榆社县| 南平市|