Redis慢查詢

生命週期

要理解redis的慢查詢,首先要理解redis一個完整的生命週期,一個命令請求的生命週期大體分爲四個步驟:發送命令->排隊->執行命令->返回結果。以下圖:mysql

以上就是redis請求的生命週期,因爲redis採用的是 單線程 架構,因此每一個命令其實是存在排隊執行的(同步阻塞)redis

這裏有兩點說明:sql

1.慢查詢發生在第3階段 即執行命令階段網絡

2.客戶端超時不必定是慢查詢致使,由於網絡環境也會致使在一、4階段的延遲。但慢查詢,是客戶端超時的一個可能因素。架構

慢查詢配置

設置慢查詢的隊列大小 : slowlog-max-len = 128 (默認值)優化

說明:redis的慢查詢實際上是一個先進先出隊列,且是固定長度,保存在內存當中。spa

設置慢查詢的記錄閥值(微秒): slowlog-log-slower-than = 10000 (默認值)線程

說明:生命週期

1.例如默認值10000,即表明命令超過10000微秒(10毫秒)就記錄到慢查詢隊列隊列

2.若是想記錄全部的命令到慢查詢,則將其值設爲 0。

3.若是全部命令都不記錄,則將其值設爲 -1。

配置方法:

1.修改配置文件重啓

2.使用命令動態配置 :

config set slowlog-max-len 1000

config set slowlog-log-slower-than 1000

慢查詢命令

slowlog get [n] --- 獲取慢查詢隊列,n可選,表明獲取多少條

slowlog len --- 獲取慢查詢隊列長度

slowlog reset --- 清空慢查詢隊列

經驗總結

1. slowlog-max-len不要設置過大,默認10ms,一般設置爲1ms

緣由:由於redis的QPS一般是萬級別 而咱們redis每一個命令的平均執行時間是0.1毫秒,若是設置過大,也就是說必須10毫秒才能記錄到這條命令的話,其實假設咱們命令若是超過 1 毫秒就會對咱們的系統產生影響,那麼設置成10毫秒將不會記錄,也就不便於咱們排查問題。

2. slowlog-log-slower-than不要設置太小,默認128 一般設置1000左右。

緣由:因爲redis的慢查詢隊列是記錄在內存當中,若是redis重啓,列表將會清空。並且它是一個先進先出隊列,隨着咱們的慢查詢不斷增多,最開始記錄的慢查詢就會丟掉,對於咱們分析歷史問題不是很方便。

3.建議按期持久化慢查詢

緣由:針對第二點,咱們能夠持久化到相似mysql的持久化存儲介質, 便於咱們查詢歷史慢查詢的操做,方便系統優化和排錯。

相關文章
相關標籤/搜索