慢查询日志
慢查询日志功能用于记录执行时间超过给定时长的命令请求,用户可以根据这个优化查询速度
使用
通过配置文件中的参数slowlog-log-lower-than 指定超过多少微秒的命令会被记录到日志上。
通过配置文件中的参数slowlog-max-len选项的值控制命令的数量。其采用的数据结构是固定长度的队列。
通过在客户端执行命令config set slowlog-log-lower-than 和slowlog-max-len可以修改选项。
命令。或者直接在配置文件中修改。
底层实现
服务器状态redisserver保存了几个和慢查询日志相关的属性,slowlog_entry_id 记录下一条慢查询日志的id,指针slowlog 指向一个链表,该链表用来保存慢查询日志,其中的每个节点是slowlogentry结构,该结构中有id记录命令的标识,time记录命令的执行时间,duration命令的消耗时间。redisserver中的slowlog-log-lower-than记录的是当命令执行超过多长微妙才记录该命令,slowlog-max-len记录慢查询日志链表的最大长度。
Config get、config len、 config reset
Config get—该命令执行是通过遍历redisserver中的属性slowlog这个链表,来将所有结构为slowlogentry的节点信息打印出来。
Config len—该命令通过返回slowlog链表的长度来打印日志的长度。
Config reset —遍历链表,将链表中的所有节点都删除。
添加日志
在每次执行命令的之前和之后都有一个变量记录unix时间戳,两者之差即为命令执行时间,将命令执行时间传给slowlogPushEntryIfNeed函数。
slowlogPushEntryIfNeed—一个作用是检查命令执行时间是否超过设定的阀值,如果是的话,就为命令创建一个新日志(slowlogentry),添加到链表(slowlog)的表头。第二个作用就是查询日志长度是否超过设定的阀值(slowlog-max-len),如果是的话,将旧的日志从链表中删除。
slowlogPushEntryIfNeed—函数中调用了一个函数slowlogCreateEntry,该函数根据传入的参数创建一个新的日志(slowlogentry),并将redisserver.slowlog_entry_id 的值加1。