赞
踩
Redis的慢查询日志功能用于记录执行时间超过给定时长的命令请求,用户可以通过这个功能产生的日志来
监视和优化查询速度。服务器配置有两个和慢查询日志相关的选项:
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> SET msg "hello world"
OK
127.0.0.1:6379> SET number 10086
OK
127.0.0.1:6379> SET database "Redis"
OK
然后使用SLOWLOG GET命令查看服务器所保存的慢查询日志:
如果这是再执行一条SLOWLOG GET命令,那么将看到,上一次执行的SLOWLOG GET命令已经被记录到了慢查询日志中,而最旧的、ID为0的慢查询日志已经被删除,服务器的慢查询日志数量仍然为5条
1) 1) (integer) 6 2) (integer) 1713670934 3) (integer) 5 4) 1) "SET" 2) "database" 3) "Redis" 2) 1) (integer) 5 2) (integer) 1713670927 3) (integer) 6 4) 1) "SET" 2) "number" 3) "10086" 3) 1) (integer) 4 2) (integer) 1713670923 3) (integer) 10 4) 1) "SET" 2) "msg" 3) "hello world" 4) 1) (integer) 3 2) (integer) 1713670868 3) (integer) 6 4) 1) "CONFIG" 2) "SET" 3) "slowlog-max-len" 4) "5" 5) 1) (integer) 2 2) (integer) 1713670860 3) (integer) 7 4) 1) "CONFIG" 2) "SET" 3) "slowlog-log-slower-than" 4) "0"
1) 1) (integer) 7 2) (integer) 1713670977 3) (integer) 2095 4) 1) "SLOWLOG" 2) "GET" 2) 1) (integer) 6 2) (integer) 1713670934 3) (integer) 5 4) 1) "SET" 2) "database" 3) "Redis" 3) 1) (integer) 5 2) (integer) 1713670927 3) (integer) 6 4) 1) "SET" 2) "number" 3) "10086" 4) 1) (integer) 4 2) (integer) 1713670923 3) (integer) 10 4) 1) "SET" 2) "msg" 3) "hello world" 5) 1) (integer) 3 2) (integer) 1713670868 3) (integer) 6 4) 1) "CONFIG" 2) "SET" 3) "slowlog-max-len" 4) "5"
服务器状态中包含了几个和慢查询日志功能有关的属性:
struct redisServer { // ... // 下一条慢查询日志的ID long long slowlog_entry_id; // 保存了所有慢查询日志的链表 list *slowlog; // 服务器配置slowlog-log-slower-than选项的值 long long slowlog_log_slower_than; // 服务器配置slowlog-max-len选项的值 unsigned long slowlog_max_len; // ... }
slowlog_entry_id属性的初始值为0,每当创建一条新的慢查询日志时,这个属性的值就会用作新日志的ID值,之后程序会对这个属性的值增一。例如,在创建第一条慢查询日志时,slowlog_entry_id的值0会称为第一条慢查询日志的id,而之后服务器会对这个属性的值增一;当服务器再创建新的慢查询日志的时候,slowlog_entry_id的值1就会成为第二条慢查询日志的ID,然后服务器再次对这个属性的值增一,以此类推。slowlog链表保存了服务器中的所有慢查询日志,链表中的每个节点都保存了一个
slowlogEntry结构,每个slowlogEntry结构代表一条慢查询日志:
typedef struct slowlogEntry { // 唯一标识符 long long id; // 命令执行时的时间,格式为UNIX时间戳 time_t time; // 执行命令消耗的时间,以微妙为单位 long long duration; // 命令与命令参数 robj **argv; // 命令与命令参数的数量 int argc; } slowlogEntry;
2) 1) (integer) 5
2) (integer) 1713670927
3) (integer) 6
4) 1) "SET"
2) "number"
3) "10086"
SLOWLOG GET命令的伪代码实现:
def SLOWLOG_GET(number=None): # 用户没有给定number参数 # 那么打印服务器包含的全部慢查询日志 if number is None; number = SLOWLOG_LEN() # 遍历服务器中的慢查询日志 for log in redisServer.slowlog: if number <= 0: # 打印的日志数量已经足够,跳出循环 break else: # 继续打印,将计数器的值减一 number -= 1 # 打印日志 printLog(log)
查看日志数量的SLOWLOG LEN命令可以用以下伪代码来定义
def SLOWLOG_LEN():
# slowlog链表的长度就是慢查询的条目数量
retuern len(redisServer.slowlog)
另外用于清除所有慢查询日志的SLOWLOG RESET命令可以用以下伪代码来定义
def SLOWLOG_RESET():
# 遍历服务器中的所有慢查询的日志
for log in redisServer.slowlog:
# 删除日志
deleteLog(log)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。