一、概述
Redis的慢日志查询功能用于记录执行时间超过给定时长的命令,用户可以通过这个功能产生的日志来监视和优化查询速度。
二、一条客户端命令的生命周期
- 命令发送
- 命令排队
- 命令执行
- 返回结果
注意: 慢查询只统计命令执行的时间,所以没有慢查询并不代表客户端没有超时问题
三、预设阀值怎么设置
slowlog-log-slower-than,它的单位是微秒,默认值是10000,0为记录所有命令,小于0对所有命令都不记录。不建议slowlog-log-slower-than的值设置为 = 0 或者 < 0
四、慢查询记录存放
Redis使用了一个列表来存储慢查询日志。slowlog-max-len参数用来指定列表的最大长度。一个新的命令满足慢查询条件时被插入到这个列表中,当慢查询日志列表已处于其最大长度时,最早插入的一个命令将从列表中移出,例如slowlog-max-len设置为5,当有第6条慢查询插入的话,那么队头的第一条数据就出列,第6条慢查询就会入列。
五、慢查询数据结构
每个慢查询日志有4个属性组成,分别是慢查询日志的标识id、发生时间戳、命令耗时、执行命令和参数
六、 慢查询相关命令
slowlog get [n],获取慢查询日志列表,可指定返回条数
slowlog len,获取慢查询日志列表当前的长度
slowlog reset,清空慢查询日志列表
七、实践优化
- 线上可加大slow-max-len的值,记录慢查询存长命令时redis会做截断,不会占用大量内存,线上可设置1000以上
- slowing-log- -slower-than配置建议:由于
Redis:采用单线程响应命令,对于高流量的场景,如果命令执行时间在1毫秒以上,那么
Redisa最多可支撑QPS不到1000因此对于高QPS场景的 Redis?建议设置为1毫秒 - 慢査查询只记录命令执行时间,并不包括命令排队和网络传输时间。因此客户端执行命令的时间会大于命令实际执行时间。因为命令执行排队机制,慢查询会导致其他命令级联阻塞,因此当客户端出现请求超时,需要检直该时间点是否有对应的慢查询。
- 由于慢查询日志是一个先进先出的队列,也就是说如果慢查询比较多的情况下,可能会丢失部分慢查询命令,为了防止这种情况发生,可以定期执行slowlog get命令将慢查询日志持久化到其他存储中。