1. 程式人生 > >【原創】Redis高階功能之 慢查詢

【原創】Redis高階功能之 慢查詢

一、何為慢查詢?

慢查詢功能可以有效地幫助我們找到 Redis 可能存在的瓶頸

要想理解慢查詢的定義是什麼,我們可以參見下圖。當我們在客戶端傳送命令給 Redis之後,Redis 需要對這些查詢進行排隊處理。如果這條查詢命令在內部執行的時間超過了已經配置好的時限,那麼這條命令(查詢)就是一條慢查詢。
在這裡插入圖片描述

注意:我們說的慢查詢總是發生在第三階段,也就是上圖的“3.執行命令”這一階段。並且如果客戶端超時不一定是慢查詢,但卻是客戶端超時的一個原因。因為客戶端超時不一定都是慢查詢所導致的,也可能是因為網路傳輸和排隊時間。

二、如何來配置劃分慢查詢的時限呢?

要配置慢查詢,我們需要配置兩個引數。

slowlog-log-slower-than
該選項指定執行時間超過多少微秒,也就是說,如果這條查詢(命令)的執行時間超過了這個值,那麼這條查詢(命令)就是慢查詢。

例如,如果這個選項的值為 1000,那麼執行時間超過 1000 微秒的命令就會被記錄到慢查詢日誌。如果這個選項的值為 5000,那麼執行時間超過 5000 微秒的命令就會被記錄到慢查詢日誌。以此類推。

(1) redis> CONFIG SET slowlog-log-slower-than 0
OK
(2) redis> CONFIG SET slowlog-log-slower-than 10000
OK
上面的(1)程式碼表示,CONFIG_SET 命令將 slowlog-log-slower-than 選項的值設為 0 微秒,這樣 Redis 執行的全部命令都會被記錄到慢查詢日誌

上面的(2)程式碼表示,CONFIG_SET 命令將 slowlog-log-slower-than 選項的值設為 10000微秒,這樣 Redis 執行的時間超過10000微秒的全部命令都會被記錄到慢查詢日誌

然後我們傳送幾個請求:

redis> SET msg “welcome my city”
OK

redis> SET number 12345
OK

redis> SET database “redis”
OK

通過SLOWLOG GET 命令就可以檢視慢日誌,如下。

redis> SLOWLOG GET

    1. (integer) 4 # 日誌的唯一識別符號(uid)
    2. (integer) 1338784447 # 命令執行時的 UNIX 時間戳
    3. (integer) 12 # 命令執行的時長,以微秒計算
      1. “SET” # 命令以及命令引數
      2. “database”
      3. “redis”
    1. (integer) 3
    2. (integer) 1372181139
    3. (integer) 10
      1. “SET”
      2. “number”
      3. “12345”

        slowlog-max-len
        伺服器使用先進先出(FIFO)的方式儲存多條慢查詢日誌。當伺服器儲存的慢查詢日誌數量等於 slowlog-max-len 選項的值時, 伺服器在新增一條新的慢查詢日誌之前,會先將最舊的一條慢查詢日誌刪除。也就是在伺服器的內部,儲存的慢查詢日誌記錄是有一定量的,這個量我們可以自己進行設定。

什麼意思呢?首先 Redis 會配置一個 slowlog-log-slower-than = 10000(單位:微秒),slowlog-max-len = 100,就是說 10000 微秒(1 秒等於 1,000,000 微秒)後是慢查詢,然後就把它放到佇列(記憶體)中,並且從 100 開始遞減一直到 1。如下圖所示:

在這裡插入圖片描述

三、慢查詢的預設值
我們在使用 Redis 時,可以設定慢查詢的預設值。有以下兩種方式。

方式一,請見下面程式碼。修改配置檔案

// 不推薦
config get slowlog-max-len = 128 // 設定slowlog-max-len為128,儲存資料最多128條
config get slowlog-log-slower-than = 10000// 表示超時到10000微秒會被記錄到日誌上
上面的配置是修改配置檔案後需要重啟。

方式二,動態配置。配置方式

// 推薦使用動態配置
config set slowlog-max-len 1000 // 設定slowlog-max-len為1000,儲存資料最多1000條,不能太小,也不能太大。
config set slowlog-log-slower-than 10000 // 表示超時到10000微秒會被記錄到日誌上

四、有關慢查詢的常用命令
slowlog get[n] // 獲取慢查詢佇列
slowlog len // 獲取慢查詢佇列的長度
slowlog reset // 清空慢查詢佇列
對於慢查詢,我們在實際使用的時候需要注意以下幾點。

1.slowlog-log-slower-than 不要太大,預設是 10ms,實際使用中也只是 1ms 或者 2ms,必須根據 QPS(查詢率) 的大小來設定;

2.slowlog-max-len 不要太小,通常是 1000。預設是 128。因為存在記憶體中,如果設定過小,會導致之前的慢查詢丟失,故建議改成 1000。

3.定期對慢查詢進行持久化。