总结
1.慢查询中两个重要参数slowlog-log-slower-than(预设阙值) 和 slowlog-max-len(列表最大长度)
- 阙值的设立
- 慢查询记录存放在哪里
超过这个阙值的命令将会记录在一个地方,Redis采用了列表来存储慢查询日志,slowlog-max-len便是列表长度设置。
一个新的命令满足慢查询条件时候被插入到这个列表中,当慢查询日志列表已经处于最大长度时候,最早插入的一个命令会从列表中移出
有两种修改配置方法,一种是修改配置文件,另一种是使用config set命令动态修改。
config set slowlog-log-slower-than 20000
config set slowlog-max-len 1000
config rewrite
将配置进行持久化到本地配置文件,需要执行config rewrite
虽然慢查询日志是存放在redis内存列表中的,但是Redis并没有暴露这个列表的键,而是通过一组命令来实现对慢查询日志的访问和管理。
返回的每个慢查询实体,都由四个字段组成
- 第一个字段是每个慢查询唯一标识。
- 处理完命令后的,Unix 时间戳
- 执行改名了所需要的时间,单位微秒
- 命令的参数列表,是个数组类型
慢查询日志数据结构
注意几个问题:
1.线上配置slowlog-max-len 建议调大慢查询列表,记录慢查询时Redis会对长命令做截断操作,并不会占用大量内存。增大慢查询列表可以减缓慢查询被提出的可能,设置为1000以上。
2.slowlog-log-slower-than 建议:默认超过10ms判定位慢查询,需要根据Redis并发量调整值。由于Redis单线程相应命令,对于高流量的场景,如果命令在执行1ms以上,那么Redis最多可支撑OPS不到1000.对于高OPS场景建议设置为1ms
3.慢查询只记录命令执行时间,并不包括命令排队和网络传输时间。因此客户端执行命令的时间会大于命令实际执行时间。因为命令执行排队机制,慢查询会导致其他名级联阻塞,如果出现客户端超时请求,需要检查该时间点是否有对应的慢查询,从而分析出是否是因为慢查询导致的命令级联阻塞。
4.慢查询日志是一个FIFO队列,如果查询比较多的情况下,可能会丢失部分命令,可以定期执行slow get将慢查询日志持久化到其他存储中,比如MySQL。