Redis的慢查询
一、什么是慢查询
在我们日常开发使用到的存储相关系统,例如MySQL,基本都使用到了慢查询日志来帮助我们的开发人员和运维人员去定位系统里的慢操作,以此来确定系统可能存在的瓶颈,而我们的常用到的Redis也提供了这个功能,Redis的整个执行流程可以分为如下四步:
- 发送命令
- 命令排队
- 执行命令
- 返回结果
需要注意的是,Redis提供的慢查询针对的是执行命令这一步,也就是说,如果从客户端层面来讲执行很慢的话,并不一定是这个命令本身所导致的,有可能是因为网络问题或者排队问题,我们需要根据实际的情况逐步排查。
二、如何配置慢查询
Redis给我们提供了两个慢查询相关的配置:slowlog-log-slower-than和slowlog-max-len。我们先来说第一个,这个配置是用来指定慢查询的时间阈值(单位:微秒),也就是说,多慢才算是慢查询,我们可以通过如下命令查看当前配置的阈值:
config get slowlog-log-slower-than
该配置Redis默认值为10000,也就是10ms,如果生产环境属于那种高流量的场景,可以适当降低该阈值,比如改成1ms,注意:如果将该值设为0的话,表示所有命令全部记录慢查询日志:
#为了后面更好看慢查询日志,这里设为0,生产环境不推荐
config set slowlog-log-slower-than 0
至于第二个命令slowlog-max-len,我们首先需要知道的是,Redis的慢查询日志是被保存在内存当中的slowlog链表内(内存列表),而这个配置就是用来设置这个列表的最大长度,即最大能够保存多少条慢查询日志:
config get slowlog-max-len
Redis的这个配置默认为128,也就是最大只能保存128条慢查询日志,如果说存满了,新进来的就会把最早进来的踢出去,如果配置的太小的话,可能会导致部分慢查询被覆盖掉,从而影响问题排查,所以如果是生产环境的话,可以根据实际情况,将这个配置调整为1000以上。
最后需要注意的是:通过在客户端执行命令修改上述配置后,如果后续Redis重启的话会失效,我们可以通过如下命令将配置回写到redis.conf中:
config rewrite
如果执行该命令的时候出现(error) ERR Rewriting config file: Permission denied,则需要关注一下挂载目录和容器内部目录的权限(如果是使用docker运行的),详细可以参考这篇博客:
三、慢查询操作命令
Redis给我们提供了一组命令用于操作和管理慢查询日志,可以方便我们进行线上排查,下面一起来看看:
slowlog get [n]
该命令用于获取慢查询日志,n表示返回的条数
slowlog get 3

这里看到返回了两条日志,每条日志从上往下对应的信息依次为:
- 日志的标识id
- 发生的时间戳
- 命令执行时间(微秒)
- 执行的命令以及参数
- 客户端IP和端口
- 客户端名称
需要注意的是,Redis为了不占用过多内存,会对慢查询中的长命令做截断操作!!
当然,如果是生产环境,慢查询日志比较多的话,这样直接用命令看的话可能会比较麻烦,所以建议通过定时任务定期使用slowlog get命令将慢查询日志持节化到其它存储系统,这样也不容易丢失慢查询日志。
第二个命令是:
slowlog len
该命令用于查看当前慢查询列表的长度

还有一个命令是:
slowlog reset
该命令用于将此时的所有慢查询日志全部清空,谨慎使用!!

浙公网安备 33010602011771号