Redis運維之慢查詢日志

使用好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中。

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享