Redis之慢查询分析
客戶端請求的生命周期
和Mysql數據庫一樣,Redis 也提供了慢查詢日志記錄,Redis 會把命令執行時間超過 slowlog-log-slower-than 的都記錄在 Reids 內部的一個列表(list)中,該列表的長度最大為 slowlog-max-len 。需要注意的是,慢查詢記錄的只是命令的執行時間,不包括網絡傳輸和排隊時間:
?
客戶端首先會發送一條命令。因為redis是單線程的,我們可以把服務端想象成一個隊列,在執行之前得先排隊等待之前命令的執行。
兩點說明:
(1)慢查詢發生在第三階段
(2)客戶端超時不一定慢查詢,但慢查詢是客戶端超時的一個可能因素
1.兩個配置
slowlog-max-len
用來設置存儲慢查詢記錄列表的大小,默認值為 128,當該列表滿了時,如果有新的記錄進來,那么 Redis 會把隊列中最舊的記錄清理掉,然后存儲新的記錄。
1.先進先出
2.固定長度
3.保存在內存內
slowlog-log-slower-than
用來控制慢查詢的閾值,所有執行時間超過該值的命令都會被記錄下來。該值的單位為微秒。
1.slowlog-log-slower-than=0,記錄所有闕值
2.slowlog-log-slower-than<0,不記錄所有闕值
2.配置方法
(1)默認值
127.0.0.1:6379> config get slowlog-max-len 1) "slowlog-max-len" 2) "128" ? ? 127.0.0.1:6379> config get slowlog-log-slower-than 1) "slowlog-log-slower-than" 2) "10000"(2)修改配置文件重啟(不建議)
(3)動態配置
config set slowlog-max-len 1000 config set slowlog-log-slower-than 10003.慢查詢命令
| slowlog get [n] | 獲取慢查詢隊列 |
| slowlog len | 獲取慢查詢隊列長度 |
| slowlog reset | 清空慢查詢隊列 |
下面操作返回當前 Redis 的所有慢查詢記錄,可以通過參數 n 指定查看條數:
127.0.0.1:6379> slowlog get1) 1) (integer) 1712) (integer) 15728832003) (integer) 324184) 1) "SMEMBERS"2) "p19904:message:account"2) 1) (integer) 1702) (integer) 15727407913) (integer) 129234) 1) "GET"2) "p19007:>127.0.0.1"結果說明:
1) 慢查詢記錄 id;
2) 發起命令的時間戳;
3) 命令耗時,單位為微秒;
4) 該條記錄的命令及參數;
5) 客戶端網絡套接字(ip: port);
4.注意事項
(1)slowly-max-len不要設置過大,默認10ms,通常設置1ms
由于Redis采用單線程響應命令,對于高流量的場景,如果命令執行時間在1毫秒以上,那么Redis最多可以支撐OPS不到1000,因此對于高OPS的場景的Redis建議設置1毫秒
(2)slowlog-log-slower-than不要設置過小,通常設置1000左右
(3)理解命令聲明周期
慢查詢只記錄命令執行時間,并不包括命令排隊和網絡傳輸時間。因此客戶端執行命令的時間會大于命令實際執行的時間
(4)定期持久化慢查詢
由于慢查詢日志是一個先進先出的隊列,也就是說如果慢查詢比較多的情況下,可能會丟失部分慢查詢命令,為了防止這種情況發生,可以定期執行slowlog get命令將慢查詢日志持久化到其他存儲中
總結
以上是生活随笔為你收集整理的Redis之慢查询分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式之2PC与3PC提交协议
- 下一篇: Redis之GEO存储地理位置信息