许多存储系统(例如MySQL)提供慢查询日志帮助开发和运维人员定位系统存在的慢操作。所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阈值,就将这条命令的相关信息(例如:发生时间、耗时、命令的详细信息)记录下来,Redis也提供了类似的功能。
Redis 命令的执行过程
慢查询日志的参数
slowlog-log-slower-than :指定执行时间超过多少微秒(1秒等于1000000微秒) 的命令请求会被记录到日志上。
举个栗子:如果这个选项值为100,那么执行时间超过100微秒的命令就会被记录到慢查询日志;如果这个选项值为500,那么执行时间超过500微秒的命令就会被记录到慢查询日志。
slowlog-max-len :指定服务器最多保存多少条慢查询操作,服务器先进先出的方式保存多条慢查询日志,当服务器存储的慢查询数量等于slowlog-log-len选项值时,服务器在添加一条新的慢查询日志之前,会先将对旧的一条慢日志先删除。
举个栗子:如果服务器 slowlog-log-len 的值为100,并且假设服务器已经存储了100条慢查询日志,那么如果服务器打算添加一条新的慢查询日志的话,他就必须先删除目前保存的最旧的那条日志,然后在添加新日志。
实际现象如下:
先使用config set命令将 slow-log-slower-than 参数的设置为0微秒,这样 redis 服务器执行的任何命令都会记录到慢查询日志中。接着把 slowlog-max-len 参数的值设置的5,让服务器最多只保存5条慢查询记录
127.0.0.1:6379> config set slowlog-log-slower-than 0
OK
127.0.0.1:6379> config set slowlog-max-len 5
OK
127.0.0.1:6379>
下面我们使用redis客户端发送几个请求:
127.0.0.1:6379> set msg "hello world"
OK
127.0.0.1:6379> set number 10086
OK
127.0.0.1:6379> set database "Redis"
OK
127.0.0.1:6379> set sql mysql
OK
127.0.0.1:6379> set nosql memcache
OK
127.0.0.1:6379>
然后使用slowlog get来查看服务器所保存的慢查询日志:
127.0.0.1:6379> slowlog get
1) 1) (integer) 6
2) (integer) 1610158493
3) (integer) 11
4) 1) "set"
2) "nosql"
3) "memcache"
5) "127.0.0.1:40024"
6) ""
2) 1) (integer) 5
2) (integer) 1610158478
3) (integer) 10
4) 1) "set"
2) "sql"
3) "mysql"
5) "127.0.0.1:40024"
6) ""
3) 1) (integer) 4
2) (integer) 1610158457
3) (integer) 9
4) 1) "set"
2) "database"
3) "Redis"
5) "127.0.0.1:40024"
6) ""
4) 1) (integer) 3
2) (integer) 1610158437
3) (integer) 20
4) 1) "set"
2) "number"
3) "10086"
5) "127.0.0.1:40024"
6) ""
5) 1) (integer) 2
2) (integer) 1610158422
3) (integer) 21
4) 1) "set"
2) "msg"
3) "hello world"
5) "127.0.0.1:40024"
6) ""
127.0.0.1:6379>
慢查询日志的保存
服务器状态中包含了几个慢查询日志功能有关的属性:
struct redisServer {
long long slowlog_entry_id;
list *slowlog;
long long slowlog_log_slower_than;
unsigned long slowlog_max_len;
}
slowlog_entry_id 属性的初始值为0,每当创建一天新的慢查询日志时,这个属性值就会作用到新日志的 id 值,之后程序会对这个属性的值增一。
|