专栏首页每天晒白牙Redis慢查询日志

Redis慢查询日志

Redis慢查询日志

Redis慢查询日志功能是用于记录执行时间超过给定时长的命令请求,可以通过查看慢查询日志来监控和优化查询速度

慢查询配置相关的参数

  1. slowlog-log-slower-than:指定执行时间超过多少微秒的命令会被记录到日志上

例如,该值设为100,则执行时间超过100微秒的命令会被记录到慢查询日志中

  1. slowlog-max-len:指定服务器上最多保存慢查询日志的条数 例如,该值设为5,那么命令执行时间超过slowlog-log-slower-than设置的时间的命令会被记录到慢查询日志上,如果慢查询日志的数量等于5,那么再添加慢查询日志时,需要把最早添加的慢查询日志删除,即慢查询日志删除采用 先进先出 的方式

慢查询日志相关命令

  1. config set slowlog-log-slower-than 100 # 设置set slowlog-log-slower-than
  2. config set slowlog-max-len 5 # 设置 slowlog-max-len
  3. slowlog get # 查看慢查询日志

先看下服务器现在的默认配置

可以发现我的服务器配置的慢查询日志的时间的10ms,慢日志的条数是 128

慢查询记录

通过 slowlog get 查看慢查询日志是什么样子?【从其他redis服务器看的】

慢查询日志的添加和删除

我们在前面已经介绍过,当慢查询日志的条数超过最大值时,采用 先进先出 的方式删除最老的慢查询日志

下面我们通过修改慢查询日志的配置来演示下 慢日志的删除是先进先出

把 slowlog-log-slower-than 设为0,这样任何redis的命令都会被当做慢查询命令添加到慢查询日志中

把 slowlog-max-len 设为 2,这样慢查询日志大小为2

配置完后,看下图

在客户端发送3条redis的命令,这样就能验证删除逻辑

先发送2条命令,然后看下慢查询日志,如下图所示

因我们配置的slowlog-max-len是2,所以当我在发送redis命令的时候,慢查询日志要执行删除策略,如下图所示

可以发现慢查询日志中,已经没有了 set str1 '1' 和 set str2 '2',验证了慢查询日志删除遵循 先进先出

通过实验验证了 redis 的慢查询记录采用 先进先出 的方式删除,那么我们通过 redis 的源码 https://github.com/antirez/redis/blob/unstable/src/slowlog.c

每次执行命令前后会记录unix时间戳,两个时间戳的差就是命令执行的时间,也就是下面源码中的 duration

/* Push a new entry into the slow log.
 * This function will make sure to trim the slow log accordingly to the
 * configured max length. */
void slowlogPushEntryIfNeeded(client *c, robj **argv, int argc, long long duration) {
    // 未开启慢查询功能,直接返回
    if (server.slowlog_log_slower_than < 0) return; /* Slowlog disabled */
    // 命令执行时间超过了设置的超时时间的上限,将命令添加到慢查询日志中,采用头插入的方式
    if (duration >= server.slowlog_log_slower_than)
        // 从头插入
        listAddNodeHead(server.slowlog,
                        // 创建一个慢查询记录对象
                        slowlogCreateEntry(c,argv,argc,duration));

    /* Remove old entries if needed. */
    // 日志超过最值的最大值,进行删除
    while (listLength(server.slowlog) > server.slowlog_max_len)
        // 删除日志,删除最早添加的,即在列表尾部的
        listDelNode(server.slowlog,listLast(server.slowlog));
}

小结

  1. redis慢查询日志主要和 slowlog-log-slower-than、 slowlog-max-len两个参数有关
  2. redis慢日志的删除采用 先进先出 的方式

备注

在 linux 部署 redis 需要服务器安装 gcc ,需要 root 权限,所以我采用 docker 方式部署,比较方便

  1. docker pull redis # 获取最新的 redis 镜像
  2. docker run --name redis -d -p 6379:6379 redis # 启动 redis 实例并制定端口
  3. docker exec -it redis 容器id redis-cli # 连接 redis 客户端 其中 redis 容器id 通过命令 docker ps查看

如果是win本用 winpty docker exec -it b29f7ba42310 redis-cli

本文分享自微信公众号 - 每天晒白牙(shaibaiya),作者:每天晒白牙

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 原创|如果懂了HashMap这两点,面试就没问题了

    HashMap 是后端面试的常客,比如默认初始容量是多少?加载因子是多少?是线程非安全的吗?put 操作过程复述下?get 操作复述下?在 jdk 1.7 和 ...

    每天晒白牙
  • 类加载器知识点吐血整理

    我们平时写的代码或程序到底是如何运行起来的呢? 比如我开发用的是 java 语言,源码是是 .java 的文件,但他们是没有办法运行的。通常我们会打成 jar ...

    每天晒白牙
  • Reactor线程模型

    根据大神Doug Lea 在 《Scalable IO in Java 》中的介绍,Reacotr模型主要分为三个角色

    每天晒白牙
  • Redis 安装

    Parker
  • 聊聊flink DataStream的join操作

    flink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/data...

    codecraft
  • 联发科半年报:5G芯片立头功,高端与高通硬刚

    5G终端混战愈演愈烈之际,联发科的表现却越来越稳定。7月10日,联发科公布了2020年6月及上半年营收简易报告。根据报告,联发科6月份营收252.8亿新台币,同...

    刘旷
  • 华为备胎联发科转正

    近日,Canalys、IDC、Counterpoint三家权威调研机构得出一致结论:华为首次超越三星,在2020年第二季度成为全球出货量最高的手机厂商。在波谲云...

    金融外参
  • 聊聊flink DataStream的join操作

    flink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/data...

    codecraft
  • CentOS上配置rsyslog日志客户端

    rsyslog是一个开源工具,被广泛用于Linux系统以通过TCP/UDP协议转发或接收日志消息。rsyslog守护进程可以被配置成两种环境,一种是配置成日志收...

    yuanfan2012
  • VMware网络设置

    踏歌行

扫码关注云+社区

领取腾讯云代金券