天天看點

Redis(1.20)redis慢查詢,redis slowlog

慢查詢,顧名思義就是比較慢的查詢,但是究竟是哪裡慢呢?首先,我們了解一下Redis指令執行的整個過程:

  

Redis(1.20)redis慢查詢,redis slowlog

發送指令

指令排隊

指令執行

傳回結果

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

因為Redis中指令執行的排隊機制,慢查詢會導緻其他指令的級聯阻塞,是以當用戶端出現請求逾時的時候,需要檢查該時間點是否有慢查詢,進而分析出由于慢查詢導緻的指令級聯阻塞。

慢查詢日志是Redis服務端在指令執行前後計算每條指令的執行時長,當超過某個門檻值是記錄下來的日志。日志中記錄了慢查詢發生的時間,還有執行時長、具體什麼指令等資訊,它可以用來幫助開發和運維人員定位系統中存在的慢查詢。

預設最近的 10 個

可以使用slowlog get指令擷取慢查詢日志,在slowlog get後面還可以加一個數字,用于指定擷取慢查詢日志的條數,比如,擷取3條慢查詢日志:

從上面的例子中,可以看出每一條慢查詢日志都有4個屬性組成:

唯一辨別ID

指令執行的時間戳

指令執行時長(微秒)

執行的命名和參數

可以使用slowlog len指令擷取慢查詢日志的長度,比如:

在上例中,目前Redis中有121條慢查詢日志。

可以使用slowlog reset指令清理慢查詢日志,比如:

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

接下來我們詳細介紹一下這兩個參數:

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的作用是指定慢查詢日志最多存儲的條數。

實際上,Redis使用了一個清單存放慢查詢日志,slowlog-max-len就是這個清單的最大長度。

當一個新的指令滿足滿足慢查詢條件時,被插入這個清單中。當慢查詢日志清單已經達到最大長度時,最早插入的那條指令将被從清單中移出。

比如,slowlog-max-len被設定為10,當有第11條指令插入時,在清單中的第1條指令先被移出,然後再把第11條指令放入清單。

記錄慢查詢是Redis會對長指令進行截斷,不會大量占用大量記憶體。

在實際的生産環境中,為了減緩慢查詢被移出的可能和更友善地定位慢查詢,建議将慢查詢日志的長度調整的大一些。比如可以設定為1000以上。

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

1=》修改Redis配置檔案。

比如,把slowlog-log-slower-than設定為1000,slowlog-max-len設定為1200:

2=》使用config set指令動态修改。

比如,還是把slowlog-log-slower-than設定為1000,slowlog-max-len設定為1200:

如果要Redis把配置持久化到本地配置檔案,需要執行config rewrite指令。

  慢查詢指的是指令執行時長比較長的查詢。通過slowlog get指令擷取慢查詢日志;

  通過slowlog len指令擷取慢查詢日志的長度;通過slowlog reset指令清理慢查詢日志。

  通過slowlog-log-slower-than配置指令執行時長的門檻值;通過slowlog-max-len配置慢查詢日志最多存儲的條數。

繼續閱讀