Redis 客戶端執行命令分四個部分:
- 發送命令
- 命令排隊
- 命令執行
- 返回結果
Redis 的慢查詢只統計步奏3)的時間,所以沒有慢查詢并不代表客戶端沒有超時的問題
慢查詢參數配置
Redis 通過 slowlog-log-slower-than 和 slowlog-max-len 分別配置慢查詢的閾值,以及慢查詢記錄的日志長度。 slowlog-log-slower-than 默認值 10*1000微秒,當命令執行時間查過設定時,那么將會被記錄在慢查詢日志中。
如果slowlog-log-slower-than=0會記錄所有的命令,slowlog-log-slower-than<0 對于任何命令都不會進行記錄。
slowlog-max-len 用于設置慢查詢日志記錄大小,Redis 使用一個類似于蓋子集合的列表保存慢查詢日志,當列表的日志記錄條數大于slowlog-max-len設定的值后,早先的記錄將會被移除。
參數設定:
config set slowlog-log-slower-than 20000
config set slowlog-max-len 1000
config rewrite
如果要 Redis 將配置持久化到本地配置文件,需要執行 config rewrite 命令.
慢查詢日志被存放在 Redis 內存列表中的,但是 Redis 并沒有暴露這個列表的鍵,
而是通過一組命令來實現對慢查詢日志的訪問和管理。
1)獲取慢查詢日志:
slowlog get [n] // n 表示返回的日志記錄條數
每個慢查詢日志有 4 個屬性組成,分別是慢查詢日志的標識 id、發生時間戳、命令耗時、執行命令和參數,慢查詢列表如下:
127.0.0.1:6378> slowlog get
1) 1) (integer) 0 //標識 id
2) (integer) 1501750261 //時間戳
3) (integer) 19 // 命令耗時
4) 1) "config" // 執行命令
2) "set"
3) "slowlog-log-slower-than"
4) "0"
127.0.0.1:6378>
2)獲取慢查詢日志列表當前的長度
127.0.0.1:6378> slowlog len
(integer) 2
127.0.0.1:6378>
慢查詢最佳實踐
- slowlog-max-len 配置建議:線上建議調大慢查詢列表,記錄慢查詢時 Redis 會對長命令做截斷操作,并不會占用大量內存。增大慢查詢列表可以減緩慢查詢被剔除的可能,例如線上可設置為 1000 以上。
- slowlog-log-slower-than 配置建議:默認值超過 10 毫秒判定為慢查詢,需要根據 Redis 并發量調整該值。由于 Redis 采用單線程響應命令,對于高流量的場景,如果命令執行時間在 1 毫秒以上,那么 Redis 最多可支撐 OPS 不到 1000。因此對于高 OPS (operation per second)場景的 Redis 建議設置為 1 毫秒。
- 慢查詢只記錄命令執行時間,并不包括命令排隊和網絡傳輸時間。因此客戶端執行命
令的時間會大于命令實際執行時間。因為命令執行排隊機制,慢查詢會導致其他命令級聯阻塞,因此當客戶端出現請求超時,需要檢查該時間點是否有對應的慢查詢,從
而分析出是否為慢查詢導致的命令級聯阻塞。 - 由于慢查詢日志是一個先進先出的隊列,也就是說如果慢查詢比較多的情況下,可能
會丟失部分慢查詢命令,為了防止這種情況發生,可以定期執行 slow get 命令將慢查詢日志持久化到其他存儲中(例如 MySQL),然后可以制作可視化界面進行查詢。