編程界的小學生
一、回顧Redis處理命令全過程
- 1、發送命令
- 2、Redis單線程,可以想象成隊列,命令太多處理不過來的情況他會排隊,逐個執行,但Redis可以達到每秒處理萬級別的命令(前提是配置好,比如不能配置aof的always等)
- 3、執行命令
- 4、給客戶端返回結果
二、慢查詢
1、說明
慢查詢發生在上圖的第3階段,也就是命令被執行所消耗的時間,比如keys *這種極其耗時的命令。命令通過網絡傳輸所消耗的時間以及排隊等待的時間不算。
2、配置
2.1、slowlog-max-len
存放慢查詢語句的是一個先進先出的隊列,他有固定長度,slowlog-max-len就是控制慢查詢語句數量的,存放到內存中的,默認128,超過128的話會捨棄最先進入隊列的命令。所以一般可以搞大點,因爲他是存放到內存的,重啓就沒了。
slowlog-max-len 128
2.2、slowlog-log-slower-than
慢查詢閾值(單位:微妙,默認是10000,也就是10毫秒)。默認是超過10ms命令沒執行完就扔到慢查詢隊列裏(上面參數控制隊列大小)。Redis號稱QPS萬級別,所以建議設置成1000,也就是1ms。
# 默認10ms
slowlog-log-slower-than 10000
# 0代表記錄所有命令
slowlog-log-slower-than 0
# 小於0代表不記錄任何命令
slowlog-log-slower-than -1
2.3、動態配置
多態更改配置,不需要重啓Redis即可讓慢日誌配置的修改失效。
config set slowlog-max-len 1000
config set slowlog-log-slower-than 1000
3、慢查詢命令
命令 | 描述 |
---|---|
slowlog get [n] | 獲取慢查詢隊列的前n條 |
slowlog len | 獲取慢查詢隊列長度 |
slowlog reset | 清空慢查詢隊列 |
三、實操
(1)動態配置時間爲0,代表每條命令都視爲慢查詢
config set slowlog-max-len 1000
config set slowlog-log-slower-than 0
(2)隨便寫幾個命令
keys *
get k1
(3)看慢查詢隊列
127.0.0.1:6379> slowlog len
(integer) 3
127.0.0.1:6379> SLOWLOG get 3
1) 1) (integer) 4
2) (integer) 1585794916
3) (integer) 12
4) 1) "get"
2) "k1"
5) "127.0.0.1:41242"
6) ""
2) 1) (integer) 3
2) (integer) 1585794914
3) (integer) 22
4) 1) "keys"
2) "*"
5) "127.0.0.1:41242"
6) ""
3) 1) (integer) 2
2) (integer) 1585794904
3) (integer) 5
4) 1) "SLOWLOG"
2) "reset"
5) "127.0.0.1:41242"
6) ""
四、個人建議
- slowlog-max-len:不要設置過大,默認10ms,建議設置1ms。
- slowlog-log-slower-than:不要設置過小,建議設置1000左右
- 定期持久化慢查詢。因爲slowlog-max-len這個隊列是放到內存裏的,重啓就沒了,而且有長度限制,所以我們要查的慢命令多的話根本不顯示,會丟失命令。所以可以用第三方插件持久化到mysql或者自己寫個腳本持久化到mysql或者文件。
五、個人公衆號
微信公衆號【Java碼農社區】