首頁 >資料庫 >Redis >Redis維之慢查詢日誌

Redis維之慢查詢日誌

齐天大圣
齐天大圣原創
2020-05-14 11:22:581777瀏覽

使用好Redis,不僅要知道Api的使用,還要知道如何防止Redis阻塞及阻塞的查看和分析。今天,和大家聊聊如何發現Redis的阻塞-透過慢查詢找到阻塞的指令。

和Mysql一樣,Redis也有慢查詢記錄。當指令的執行時間超過設定的值時,指令就會記錄到慢查詢清單中。透過慢查詢,我們可以改進我們的程式。防止redis阻塞。

配置

慢查詢的設定參數有兩個:

  • slowlog-log- slower-than

  • slowlog-max-len

#slowlog-log-slower-than用來設定一個閾值,單位為微妙,預設值為10000,即10毫秒。

  • 當值設定為小於0時,任何指令都不會記錄;

  • #當值等於0時,會記錄所有的指令。

slowlog-max-len表示最多記錄的條數,預設為128,例如將它設為10,當有第11條慢查詢插入的話,那麼隊頭的數據就會出列。

這兩個配置也支援動態配置,當專案剛開始時,訪問量不是很大時,可以將slow-log-slower-than的值設大些。當訪問量越來越大的時候,可能就需要將其值改小點。但我們不想停止redis服務,那麼就可以動態的修改該設定。

127.0.0.1:6379> config set slowlog-log-slower-than 1000
OK  
# 在线修改配置
127.0.0.1:6379> config rewrite
OK
# 将修改的配置持久化到配置文件中

維運建議:當訪問量大的時候,一般我們建議將slowlog-log-slower-than設定為1000,或更小。當這個值為1000時,表示redis最多能支援1000個並發

慢查詢查看

redis的慢查詢檢視和mysql有差別,redis查看的話有專門的指令。

取得慢速查詢日誌

slowlog get [n],n表示條數,預設為10

127.0.0.1:6379> slowlog get
1) 1) (integer) 18004
   2) (integer) 1589424642
   3) (integer) 50
   4) 1) "slowlog"
      2) "get"
   5) "127.0.0.1:58364"
   6) ""
2) 1) (integer) 18003
   2) (integer) 1589423805
   3) (integer) 47
   4) 1) "slowlog"
      2) "get"
   5) "127.0.0.1:58364"
   6) ""
……
  • 第一個參數是日誌標識id號

  • 第二個為發生時間戳

  • 第三個為指令執行的時間(微妙)

  • 最後一個是指令及參數。

取得慢查詢的長度

#slowlog len

127.0.0.1:6379> slowlog len
(integer) 128

清空慢查詢清單

127.0.0.1:6379> slowlog reset
OK

將慢查詢日誌持久化到mysql中

因為redis的長度有限制,所以在慢查詢很多的情況下,會出現遺失的情況。我們可以定時去redis取出慢查詢記錄列表,將其持久化到mysql中,防止這種情況發生。

偽代碼如下:

while (true) {
    $slowlen = $redis->slowlog('len');
    $slowlogs = $redis->slowlog('get',$slowlen);
    $insSql  = "INSERT INTO 
        slowlog(exec_time,run_time,command) VALUES";
     
    if (is_array($slowlogs) && count($slowlogs)) {
     
        foreach ($slowlogs as $slowlog) {
            $execTime = $slowlog[2];
            $runTime  = $slowlog[1];
            $command  = implode(' ', $slowlog[3]);
     
            $insSql .= "('$execTime', '$runTime','$command'),";
        }
     
        $flag = mysqli_query($mysqli, substr($insSql, 0, -1));
     
        if ($flag) {
            $redis->slowlog('reset');
        }
    }
    
    unsleep(10000);
}

以上程式碼,即可實作慢查詢持久化到MYSQL中。

以上是Redis維之慢查詢日誌的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn