redis中查看慢日誌以及返回參數值的解釋


1、問題描述

 

業務反饋,出現很多連接redis的read timed out的報錯

 

 

2、問題分析及解決

 

由於redis是單線程處理的,所有redis接收到命令,都會進入到隊列中,等待執行。

 

當客戶端,由於等待時間過長,沒有接收到server端返回的數據,就是出現超時的報錯。

 

程序裏,jedis客戶端,默認的超時時間是2s。

 

所以,懷疑是redis端在執行緩慢的命令,超過了客戶端能夠等待的最大的時間。

 

那麼,在redis服務端,命令執行過慢,會在慢日誌中進行記錄。

 

所以,查看慢日誌

 

進入到redis客戶端中,執行下面的命令

 

2.1、查看redis中設置的慢日誌記錄時間

 

這個參數的意思是,當在redis中執行的命令,超過這個時間,就會記錄慢日誌

 

10.1x.xxx.138:30001> config get slowlog-log-slower-than
"slowlog-log-slower-than"
"10000" 

 

查詢結果:10000(微秒,us)= 10毫秒(ms)

表示,當redis中執行的命令,超過10毫秒的,就會被記錄。

 

2.2、redis默認會記錄多少條慢日誌

xxxxxx:30001> config get slowlog-max-len
"slowlog-max-len"
"128"

 

查詢結果是128條。也就是隻會記錄128條慢日誌記錄。

 

OK,參數已經都明白了,接下去看當前記錄的redis的情況

 

2.3、查看慢日誌

 

xxx:30001> slowlog get 128

 

如果get後面什麼都不加,默認返回10條。

 

這裏返回全部的128條。

 

將結果輸出到一個文件裏面,查看結果如下(列出部分數據):

3965090    # slowlog的id
1700478020 # unix時間戳,
2999271    # 執行命令的時間,單位是微秒(us)
KEYS
xxcsdfADG:{${ds}_lock}:lock_idx_trans_pk_de*
?:0

3965089
1700478017
5182858
KEYS
xxcsdfDATA:{${ds}_lock}:lock_idx_trans_pk_de*
?:0

3965088
1700478012
3007463
KEYS
xxcsdfADG:{${ds}_lock}:lock_idx_trans_pk_ds*
xxxxx.141:46855

3965087
1700478009
5234263
KEYS
xxcsdfDATA:{${ds}_lock}:lock_idx_trans_pk_de*
?:0

3965086
1700478004
3038860
KEYS
xxcsdfADG:{${ds}_lock}:lock_idx_trans_pk_de*
xxxxx.141:46855

 

 

 

發現有執行,超過2秒的

3965089
1700478017
5182858   # 大於5秒 ,5182858微秒 = 51828毫秒 = 5秒
KEYS
xxcsdfDATA:{${ds}_lock}:lock_idx_trans_pk_de*
?:0

 

這樣就找到執行慢的語句了。

 

具體的執行時間,可以將時間戳進行轉換

[root@xxcsdfztsjb-node-01 ~]# date -d @1700478017
Mon Nov 20 19:00:17 CST 2023
[root@xxcsdfztsjb-node-01 ~]# 

 

 

然後,接下來,就基於這個語句讓研發繼續查就好了。

 

2.4、慢日誌記錄順序說明

 

redis默認記錄128條,慢日誌,序號 從1到128.

當超過128條的時候,第一條會被首先覆蓋掉,然後以此類推。

 

也就是說:

執行slowlog get 128時,最上面的記錄是最新的

 

這一點,也可以通過unix時間戳轉換工具來進行查看和驗證。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章