Redis 客戶端執(zhí)行命令分四個(gè)部分:
- 發(fā)送命令
- 命令排隊(duì)
- 命令執(zhí)行
- 返回結(jié)果
Redis 的慢查詢只統(tǒng)計(jì)步奏3)的時(shí)間,所以沒(méi)有慢查詢并不代表客戶端沒(méi)有超時(shí)的問(wèn)題
慢查詢參數(shù)配置
Redis 通過(guò) slowlog-log-slower-than 和 slowlog-max-len 分別配置慢查詢的閾值扫腺,以及慢查詢記錄的日志長(zhǎng)度掸绞。 slowlog-log-slower-than 默認(rèn)值 10*1000微秒,當(dāng)命令執(zhí)行時(shí)間查過(guò)設(shè)定時(shí),那么將會(huì)被記錄在慢查詢?nèi)罩局小?/p>
如果slowlog-log-slower-than=0會(huì)記錄所有的命令,slowlog-log-slower-than<0 對(duì)于任何命令都不會(huì)進(jìn)行記錄。
slowlog-max-len 用于設(shè)置慢查詢?nèi)罩居涗洿笮≌裕琑edis 使用一個(gè)類(lèi)似于蓋子集合的列表保存慢查詢?nèi)罩荆?dāng)列表的日志記錄條數(shù)大于slowlog-max-len設(shè)定的值后钓葫,早先的記錄將會(huì)被移除悄蕾。
參數(shù)設(shè)定:
config set slowlog-log-slower-than 20000
config set slowlog-max-len 1000
config rewrite
如果要 Redis 將配置持久化到本地配置文件,需要執(zhí)行 config rewrite 命令.
慢查詢?nèi)罩颈淮娣旁?Redis 內(nèi)存列表中的,但是 Redis 并沒(méi)有暴露這個(gè)列表的鍵帆调,
而是通過(guò)一組命令來(lái)實(shí)現(xiàn)對(duì)慢查詢?nèi)罩镜脑L問(wèn)和管理奠骄。
1)獲取慢查詢?nèi)罩?
slowlog get [n] // n 表示返回的日志記錄條數(shù)
每個(gè)慢查詢?nèi)罩居?4 個(gè)屬性組成,分別是慢查詢?nèi)罩镜臉?biāo)識(shí) id番刊、發(fā)生時(shí)間戳含鳞、命令耗時(shí)、執(zhí)行命令和參數(shù)芹务,慢查詢列表如下:
127.0.0.1:6378> slowlog get
1) 1) (integer) 0 //標(biāo)識(shí) id
2) (integer) 1501750261 //時(shí)間戳
3) (integer) 19 // 命令耗時(shí)
4) 1) "config" // 執(zhí)行命令
2) "set"
3) "slowlog-log-slower-than"
4) "0"
127.0.0.1:6378>
2)獲取慢查詢?nèi)罩玖斜懋?dāng)前的長(zhǎng)度
127.0.0.1:6378> slowlog len
(integer) 2
127.0.0.1:6378>
慢查詢最佳實(shí)踐
- slowlog-max-len 配置建議:線上建議調(diào)大慢查詢列表蝉绷,記錄慢查詢時(shí) Redis 會(huì)對(duì)長(zhǎng)命令做截?cái)嗖僮鳎⒉粫?huì)占用大量?jī)?nèi)存枣抱。增大慢查詢列表可以減緩慢查詢被剔除的可能熔吗,例如線上可設(shè)置為 1000 以上。
- slowlog-log-slower-than 配置建議:默認(rèn)值超過(guò) 10 毫秒判定為慢查詢佳晶,需要根據(jù) Redis 并發(fā)量調(diào)整該值桅狠。由于 Redis 采用單線程響應(yīng)命令,對(duì)于高流量的場(chǎng)景轿秧,如果命令執(zhí)行時(shí)間在 1 毫秒以上中跌,那么 Redis 最多可支撐 OPS 不到 1000。因此對(duì)于高 OPS (operation per second)場(chǎng)景的 Redis 建議設(shè)置為 1 毫秒菇篡。
- 慢查詢只記錄命令執(zhí)行時(shí)間漩符,并不包括命令排隊(duì)和網(wǎng)絡(luò)傳輸時(shí)間。因此客戶端執(zhí)行命
令的時(shí)間會(huì)大于命令實(shí)際執(zhí)行時(shí)間驱还。因?yàn)槊顖?zhí)行排隊(duì)機(jī)制嗜暴,慢查詢會(huì)導(dǎo)致其他命令級(jí)聯(lián)阻塞,因此當(dāng)客戶端出現(xiàn)請(qǐng)求超時(shí)铝侵,需要檢查該時(shí)間點(diǎn)是否有對(duì)應(yīng)的慢查詢灼伤,從
而分析出是否為慢查詢導(dǎo)致的命令級(jí)聯(lián)阻塞。 - 由于慢查詢?nèi)罩臼且粋€(gè)先進(jìn)先出的隊(duì)列咪鲜,也就是說(shuō)如果慢查詢比較多的情況下,可能
會(huì)丟失部分慢查詢命令撞鹉,為了防止這種情況發(fā)生疟丙,可以定期執(zhí)行 slow get 命令將慢查詢?nèi)罩境志没狡渌鎯?chǔ)中(例如 MySQL),然后可以制作可視化界面進(jìn)行查詢鸟雏。