美文网首页
redis 详解系列之二(慢查询分析与pipeline管道)

redis 详解系列之二(慢查询分析与pipeline管道)

作者: 落羽归尘 | 来源:发表于2019-08-13 23:04 被阅读0次

    慢查询分析

    慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过所设置的阈值,就会把这条命令的相关信息记录下来,比如:消耗时间等。redis的命令执行过程是:客户端发生命令到redis服务端,redis将这条命令加入队列,这条命令排队等待执行,执行完后返回结果。慢查询只统计命令的执行时间,不包括排队和网络io等。
    慢查询分析有两个需要注意的点:阈值和日志保存的地方。下面是和慢查询有关两个参数:

    • slowlog-log-slower-than 慢查询的阈值,单位是微妙,比如为10000时,代表超过这个值得命令都会记录下来。
    • slowlog-max-len 慢查询日志记录的条数,慢查询记录记录在一个列表中,列表的长度就是slowlog-max-len,如果超过这个值,超过的部分会从列表头部弹出,也就是只保留最近的slowlog-max-len条。

    可以使用如下命令动态修改这两个参数,并持久化到配置文件

    config set slowlog-log-slower-than 20000
    config set slowlog-max-len 1000
    config rewrite
    

    那么如果想要查看慢查询日志

    slowlog get [n]  # n是条数
    

    每条记录都包括发生时间、命令耗时、命令和参数。

    slowlog len  # 查看有多少条记录
    slowlog reset   # 清空列表
    
    建议

    阈值设置时,默认超过10ms为慢查询,可以根据实际情况来调整此值。由于存储的队列是先进先出,可以定时持久化到数据库,免得重要日志丢失。

    pipeline 管道

    由于redis的执行过程是:发送命令,排队,执行,返回。整个过程为一个往返时间,redis的批量操作,能节省往返时间。
    pipeline是一个管道,可以将多个命令放进来一起发送至服务端。
    一般情况下,n条命令耗时=n(发送命令+排队+执行+返回)。使用pipeline时,n条命令耗时=发送命令+n(排队+执行)+返回。大大减少了网络io时间,网络延时越大,效果越明显,所有才有一个说法,redis的瓶颈是网络。
    pipeline只是模拟批量操作,但和批量命令有本质的区别,批量命令是原子操作,而pipeline是非原子的,只是把多个命令一块发送至服务端,执行的时候还是要一个一个执行的。有一个要注意的地方,pipeline使用时,一定要注意命令不能无限多,防止过多造成网络阻塞。
    基本上主流语言的redis客户端包都支持pipeline操作,有各自的用法。下面以python为例:

    import redis
    client = redis.StrictRedis(host='127.0.0.1', port=6379)
    pipeline = client.pipeline(transaction=False)
    
    # 将命令放进pipeline,此时未执行
    pipeline.set("key1","v1")
    pipeline.incr("c")
    # 下面才是执行
    result = pipeline.execute()
    
    

    详细用法可以参考官方文档:

    相关文章

      网友评论

          本文标题:redis 详解系列之二(慢查询分析与pipeline管道)

          本文链接:https://www.haomeiwen.com/subject/fieijctx.html