Redis之慢查询分析
客戶端請(qǐng)求的生命周期
和Mysql數(shù)據(jù)庫(kù)一樣,Redis 也提供了慢查詢?nèi)罩居涗?#xff0c;Redis 會(huì)把命令執(zhí)行時(shí)間超過(guò) slowlog-log-slower-than 的都記錄在 Reids 內(nèi)部的一個(gè)列表(list)中,該列表的長(zhǎng)度最大為 slowlog-max-len 。需要注意的是,慢查詢記錄的只是命令的執(zhí)行時(shí)間,不包括網(wǎng)絡(luò)傳輸和排隊(duì)時(shí)間:
?
客戶端首先會(huì)發(fā)送一條命令。因?yàn)閞edis是單線程的,我們可以把服務(wù)端想象成一個(gè)隊(duì)列,在執(zhí)行之前得先排隊(duì)等待之前命令的執(zhí)行。
兩點(diǎn)說(shuō)明:
(1)慢查詢發(fā)生在第三階段
(2)客戶端超時(shí)不一定慢查詢,但慢查詢是客戶端超時(shí)的一個(gè)可能因素
1.兩個(gè)配置
slowlog-max-len
用來(lái)設(shè)置存儲(chǔ)慢查詢記錄列表的大小,默認(rèn)值為 128,當(dāng)該列表滿了時(shí),如果有新的記錄進(jìn)來(lái),那么 Redis 會(huì)把隊(duì)列中最舊的記錄清理掉,然后存儲(chǔ)新的記錄。
1.先進(jìn)先出
2.固定長(zhǎng)度
3.保存在內(nèi)存內(nèi)
slowlog-log-slower-than
用來(lái)控制慢查詢的閾值,所有執(zhí)行時(shí)間超過(guò)該值的命令都會(huì)被記錄下來(lái)。該值的單位為微秒。
1.slowlog-log-slower-than=0,記錄所有闕值
2.slowlog-log-slower-than<0,不記錄所有闕值
2.配置方法
(1)默認(rèn)值
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)動(dòng)態(tài)配置
config set slowlog-max-len 1000 config set slowlog-log-slower-than 10003.慢查詢命令
| slowlog get [n] | 獲取慢查詢隊(duì)列 |
| slowlog len | 獲取慢查詢隊(duì)列長(zhǎng)度 |
| slowlog reset | 清空慢查詢隊(duì)列 |
下面操作返回當(dāng)前 Redis 的所有慢查詢記錄,可以通過(guò)參數(shù) n 指定查看條數(shù):
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"結(jié)果說(shuō)明:
1) 慢查詢記錄 id;
2) 發(fā)起命令的時(shí)間戳;
3) 命令耗時(shí),單位為微秒;
4) 該條記錄的命令及參數(shù);
5) 客戶端網(wǎng)絡(luò)套接字(ip: port);
4.注意事項(xiàng)
(1)slowly-max-len不要設(shè)置過(guò)大,默認(rèn)10ms,通常設(shè)置1ms
由于Redis采用單線程響應(yīng)命令,對(duì)于高流量的場(chǎng)景,如果命令執(zhí)行時(shí)間在1毫秒以上,那么Redis最多可以支撐OPS不到1000,因此對(duì)于高OPS的場(chǎng)景的Redis建議設(shè)置1毫秒
(2)slowlog-log-slower-than不要設(shè)置過(guò)小,通常設(shè)置1000左右
(3)理解命令聲明周期
慢查詢只記錄命令執(zhí)行時(shí)間,并不包括命令排隊(duì)和網(wǎng)絡(luò)傳輸時(shí)間。因此客戶端執(zhí)行命令的時(shí)間會(huì)大于命令實(shí)際執(zhí)行的時(shí)間
(4)定期持久化慢查詢
由于慢查詢?nèi)罩臼且粋€(gè)先進(jìn)先出的隊(duì)列,也就是說(shuō)如果慢查詢比較多的情況下,可能會(huì)丟失部分慢查詢命令,為了防止這種情況發(fā)生,可以定期執(zhí)行slowlog get命令將慢查詢?nèi)罩境志没狡渌鎯?chǔ)中
總結(jié)
以上是生活随笔為你收集整理的Redis之慢查询分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 分布式之2PC与3PC提交协议
- 下一篇: Redis之GEO存储地理位置信息