Redis的慢查询问题总结

 什么是慢查询日志?

慢查询日志是Redis服务端在命令执行前后计算每条命令的执行时长,当超过某个阈值是记录下来的日志。日志中记录了慢查询发生的时间,还有执行时长、具体什么命令等信息,它可以用来帮助开发和运维人员定位系统中存在的慢查询。

慢日志配置
查看redis慢日志配置,登陆redis服务器,使用redis-cli客户端连接redis server
使用命令 config get slow*

1 127.0.0.1:6379> config get slow*
2 1) "slowlog-log-slower-than"
3 2) "10000"
4 3) "slowlog-max-len"
5 4) "128"

慢日志说明:
config get slow* 查询有关慢日志的配置信息
查询结果第一条: 1) "slowlog-log-slower-than" 慢日志阈值配置项
查询结果第二条: 2) "10000" 阈值 ,单位微秒,此处为10毫秒,即超过10毫秒的操作都会记录下来
查询结果第三条: 3) "slowlog-max-len" 慢日志记录保存数量,如果保存数量已满,会删除最早的记录,最新的记录追加进来
查询结果第四条: 4) "1000" 慢日志记录保存数量的阈值,此处保存1000条记录

查看慢日志记录
查看redis慢日志记录,登陆redis服务器,使用redis-cli客户端连接redis server
使用命令 SLOWLOG GET N,查询结果如下图所示:

1) (integer) 65
2) (integer) 1500621891
3) (integer) 1186934
4) 1) "keys"
   2) "*CAP:*"
1) (integer) 65 值65数据类型为integer,表示该条日志的id
2) (integer) 1500621891  值1500621891数据类型为integer,表示操作redis的unix时间戳,单位秒。
3) (integer) 1186934 操作耗时,单位微秒
4)  1) "keys" 操作redis的命令 keys
   2) "*CAP:*" 操作redis的命令keys 的参数,即查询所有包含CAP字符串的key

把操作redis的unix时间戳换算成北京时间为 2017/7/21 15:24:51 ,与某系统交易耗时的日志时间点一吻合。某系统交易耗时时间点二的问题也是如此。
结论:
Redis命令keys * 、 keys *xxx* 会遍历所有key,以查找符合条件的key,当数据量较大时该命令比较耗时,因为redis是单线程,当该命令执行的过程当中会阻塞其他命令请求,如果此时应用系统请求redis,所有的请求都会等待。在生环境中,严禁使用keys * 、 keys *xxx*,最好的办法是禁用相关命令。
补充说明:慢日志中的"BGREWRITEAOF"是redis fork的另外的子进程在执行aof文件重新,该操作不会影响应用对redis的读写请求。

posted @ 2021-02-26 13:58  郭慕荣  阅读(1369)  评论(0编辑  收藏  举报