一篇文章快速搞懂Redis的慢查詢分析

什麼是慢查詢?

慢查詢,顧名思義就是比較慢的查詢,可是到底是哪裏慢呢?首先,咱們瞭解一下Redis命令執行的整個過程:微信

  1. 發送命令
  2. 命令排隊
  3. 命令執行
  4. 返回結果

在慢查詢的定義中,統計比較慢的時間段指的是命令執行這個步驟。沒有慢查詢,並不表示客戶端沒有超時問題,有可能網絡傳輸有延遲,也有可能排隊的命令比較多。網絡

由於Redis中命令執行的排隊機制,慢查詢會致使其餘命令的級聯阻塞,因此當客戶端出現請求超時的時候,須要檢查該時間點是否有慢查詢,從而分析出因爲慢查詢致使的命令級聯阻塞。併發

歡迎關注微信公衆號:萬貓學社,每週一分享Java技術乾貨。運維

什麼是慢查詢日誌?

慢查詢日誌是Redis服務端在命令執行先後計算每條命令的執行時長,當超過某個閾值是記錄下來的日誌。日誌中記錄了慢查詢發生的時間,還有執行時長、具體什麼命令等信息,它能夠用來幫助開發和運維人員定位系統中存在的慢查詢。高併發

如何獲取慢查詢日誌?

可使用slowlog get命令獲取慢查詢日誌,在slowlog get後面還能夠加一個數字,用於指定獲取慢查詢日誌的條數,好比,獲取3條慢查詢日誌:spa

> slowlog get 3
1) 1) (integer) 6107
   2) (integer) 1616398930
   3) (integer) 3109
   4) 1) "config"
      2) "rewrite"
2) 1) (integer) 6106
   2) (integer) 1613701788
   3) (integer) 36004
   4) 1) "flushall"
3) 1) (integer) 6105
   2) (integer) 1608722338
   3) (integer) 20449
   4) 1) "scan"
      2) "0"
      3) "MATCH"
      4) "*comment*"
      5) "COUNT"
      6) "10000"

從上面的例子中,能夠看出每一條慢查詢日誌都有4個屬性組成:線程

  1. 惟一標識ID
  2. 命令執行的時間戳
  3. 命令執行時長
  4. 執行的命名和參數

歡迎關注微信公衆號:萬貓學社,每週一分享Java技術乾貨。rest

如何獲取慢查詢日誌的長度?

可使用slowlog len命令獲取慢查詢日誌的長度,好比:日誌

> slowlog len
(integer) 121

在上例中,當前Redis中有121條慢查詢日誌。code

如何清理慢查詢日誌?

可使用slowlog reset命令清理慢查詢日誌,好比:

> slowlog len
(integer) 121
> slowlog reset
OK
> slowlog len
(integer) 0

怎麼配置慢查詢的參數?

正如上面提到的,慢查詢須要以下兩個配置:

  1. 命令執行時長的指定閾值。
  2. 存放慢查詢日誌的條數。

Redis對應提供了兩個參數:slowlog-log-slower-than和slowlog-max-len,接下來咱們詳細介紹一下這兩個參數。

歡迎關注微信公衆號:萬貓學社,每週一分享Java技術乾貨。

slowlog-log-slower-than

slowlog-log-slower-than的做用是指定命令執行時長的閾值,執行命令的時長超過這個閾值時就會被記錄下來。它的單位是微秒(1秒 = 1000毫秒 = 1000000微秒),默認是10000微秒。若是把slowlog-log-slower-than設置爲0,將會記錄全部命令到日誌中。若是把slowlog-log-slower-than設置小於0,將會不記錄任何命令到日誌中。

在實際的生產環境中,須要根據Redis併發量來調整該配置。由於Redis採用單線程響應命令,若是命令執行時間在1000微秒以上,那麼Redis最多可支撐OPS不到1000,因此對於高併發場景的Redis建議設置爲1000微秒

slowlog-max-len

slowlog-max-len的做用是指定慢查詢日誌最多存儲的條數。實際上,Redis使用了一個列表存放慢查詢日誌,slowlog-max-len就是這個列表的最大長度。當一個新的命令知足知足慢查詢條件時,被插入這個列表中。當慢查詢日誌列表已經達到最大長度時,最先插入的那條命令將被從列表中移出。好比,slowlog-max-len被設置爲10,當有第11條命令插入時,在列表中的第1條命令先被移出,而後再把第11條命令放入列表。

記錄慢查詢是Redis會對長命令進行截斷,不會大量佔用大量內存。在實際的生產環境中,爲了減緩慢查詢被移出的可能和更方便地定位慢查詢,建議將慢查詢日誌的長度調整的大一些。好比能夠設置爲1000以上

歡迎關注微信公衆號:萬貓學社,每週一分享Java技術乾貨。

如何進行配置

在Redis中有兩個修改配置的方法:

  1. 修改Redis配置文件。好比,把slowlog-log-slower-than設置爲1000,slowlog-max-len設置爲1200:
slowlog-log-slower-than 1000
slowlog-max-len 1200
  1. 使用config set命令動態修改。好比,仍是把slowlog-log-slower-than設置爲1000,slowlog-max-len設置爲1200:
> config set slowlog-log-slower-than 1000
OK
> config set slowlog-max-len 1200
OK
> config rewrite
OK

若是要Redis把配置持久化到本地配置文件,須要執行config rewrite命令。

總結

慢查詢指的是命令執行時長比較長的查詢。經過slowlog get命令獲取慢查詢日誌;經過slowlog len命令獲取慢查詢日誌的長度;經過slowlog reset命令清理慢查詢日誌。經過slowlog-log-slower-than配置命令執行時長的閾值;經過slowlog-max-len配置慢查詢日誌最多存儲的條數。

微信公衆號:萬貓學社

微信掃描二維碼

得到更多Java技術乾貨

相關文章
相關標籤/搜索