redis的slow log記錄了那些執行時間超過規定時長的請求。執行時間不包括I/O操做(好比與客戶端進行網絡通訊等),只是命令的實際執行時間(期間線程會被阻塞,沒法服務於其它請求)。 css
有兩個參數用於配置slow log: redis
slowlog-log-slower-than:設定執行時間,單位是毫秒,執行時長超過該時間的命令將會被記入log。-1表示不記錄slow log; 0強制記錄全部命令。 網絡
slowlog-max-len: slow log的長度。最小值爲0。若是日誌隊列已超出最大長度,則最先的記錄會被從隊列中清除。 工具
能夠經過編輯redis.conf文件配置以上兩個參數。對運行中的redis, 能夠經過config get, config set命令動態改變上述兩個參數性能
使用這個命令能夠讀取或重置 Redis 慢速查詢日誌。通俗講就是 redis 能夠把執行時間超過咱們設定值的命令記錄下來,slowlog 是記錄到內存中的哦,因此很是快。spa
兩種方式:線程
這裏咱們主要說的是第二種方式,您可使用兩個參數來配置慢日誌:slowlog-log-slow-than * ,告訴 Redis, 記錄超過 * 微秒 內的命令執行狀況。unix
須要注意的是,設置負數表示禁用 slowlog ,而設置 0 則強制記錄每一個命令的執行狀況。
如下是 slowlog 的設置使用說明:日誌
redis 127.0.0.1:6379>config set slowlog-log-slower-than 10000
"OK"
redis 127.0.0.1:6379>config get slowlog-log-slower-than
1) "slowlog-log-slower-than"
2) "10000"
那麼問題又來了,slowlog 是記錄再內存中的,若是記錄全部的命令 log 會不會把內容撐爆呢?code
答案是固然不會。slowlog 記錄的 log 數是有最大長度限制的,咱們能夠經過 slowlog-max-len 來查詢 slowlog 的最大長度。最小值爲零。當一個新的命令被記錄下來,而且若是已經達到它的最大長度時,最老的一個 log 將從隊列中刪除,FIFO 。
另外,使用 slowlog len 命令能夠查看當前已記錄的數量。
使用 slowlog reset 重置已記錄的 slowlog 信息。
咱們已經瞭解 slowlog 是記錄在內存中的,因此您能夠啓用全部命令的日誌記錄即 slowlog-log-slow-than 配置參數設置爲 0 便於監測性能。
要讀取 slowlog,使用 SLOWLOG GET 獲取命令,它返回慢日誌中的每個條目。能夠只返回N個最近的條目,將一個附加參數傳遞給命令(例如 SLOWLOG GET 2)。
redis 127.0.0.1:6379> slowlog get 2
1) 1) (integer) 14 //slowlog 惟一標識
2) (integer) 1309448221 //unix 時間戳
3) (integer) 15 //命令執行的時間,單位:微秒
4) 1) "ping" //具體執行的命令,最多記錄128
2) 1) (integer) 13
2) (integer) 1309448128
3) (integer) 30
4) 1) "slowlog"
2) "get"
3) "100"
//其中 Redis 4.0 及以上版本還包含如下兩部分:
5) "127.0.0.1:58217" //客戶端IP:Port
6) "worker-123" //客戶端名稱
最後,須要注意此命令須要 2.2.12及以上版本的 redis 才能支持。
因爲慢查詢日誌是一個先進先出的隊列,也就是說若是慢查詢比較多的狀況下,可能會丟失部分慢查詢命令,爲了防止這種狀況發生,能夠按期執行slowlog get
命令將慢查詢日誌持久化到其餘存儲中(例如:MySQL
、ElasticSearch
等),而後能夠經過可視化工具進行查詢
查看當前日誌的數量:
redis 127.0.0.1:6379> SLOWLOG LEN (integer) 14
使用命令 SLOWLOG RESET 能夠清空 slow log 。
redis 127.0.0.1:6379> SLOWLOG LEN (integer) 14 redis 127.0.0.1:6379> SLOWLOG RESET OK redis 127.0.0.1:6379> SLOWLOG LEN (integer) 0