Redis 慢查询,Pipline和发布订阅

慢查询

Redis 提供了慢查询日志记录,把命令执行时间超过 slowlog-log-slower-than 的都记录在 Reids 内部的一个列表(list)中,该列表的长度最大为 slowlog-max-len 。需要注意的是,慢查询记录的只是命令的执行时间,不包括网络传输和排队时间。

慢查询分析配置

关于 Redis 慢查询的配置有两个,分别是 slowlog-log-slower-thanslowlog-max-len

  • slowlog-log-slower-than,用来控制慢查询的阈值,所有执行时间超过该值的命令都会被记录下来。该值的单位为微秒,默认值为 10000,如果设置为 0,那么所有的记录都会被记录下来,如果设置为小于 0 的值,那么对于任何命令都不会记录,即关闭了慢查询。可以通过在配置文件中设置,或者用 config set 命令来设置:

    config set slowlog-log-slower-than 10000
    
  • slowlog-max-len,用来设置存储慢查询记录列表的大小,默认值为 128,当该列表满了时,如果有新的记录进来,那么 Redis 会把队最旧的记录清理掉,然后存储新的记录。在生产环境我们可以适当调大,比如调成 1000,这样就可以缓冲更多的记录,方便故障的排查。配置方法和 slowlog-log-slower-than 类似,可以在配置文件中指定,也可以在命令行执行 config set 来设置:

     config set slowlog-max-len 1000
    

查看慢查询日志

slowlog get [n] 
# 通过参数 n 指定查看条数
127.0.0.1:6379> slowlog get
 1) 1) (integer) 456
    2) (integer) 1531632044
    3) (integer) 3
    4) 1) "get"
       2) "m"
    5) "127.0.0.1:50106"
    6) ""
 2) 1) (integer) 455
    2) (integer) 1531632037
    3) (integer) 14
    4) 1) "keys"
       2) "*"
    5) "127.0.0.1:50106"
    6) ""

# 慢查询结果说明:
# 1) 慢查询记录 id; 
# 2) 发起命令的时间戳; 
# 3) 命令耗时,单位为微秒; 
# 4) 该条记录的命令及参数; 
# 5) 客户端网络套接字(ip: port); 
# 6) “”

获取当前慢查询日志记录数

slowlog len
127.0.0.1:6379> slowlog len
(integer) 458

慢查询日志重置

slowlog reset 

实际上是对慢查询列表做清理操作:

127.0.0.1:6379> slowlog len
(integer) 461
127.0.0.1:6379> slowlog reset
OK
127.0.0.1:6379> slowlog len
(integer) 1

注:

slowlog-max-len不要设置过小,通常设置1000左右
slowlog-log-slower-than不要设置过大,默认10ms,通常设置1ms 理解命令生命周期
可以通过slowlog get等命令定期将慢查询命令持久化到其他数据源,这样就可以查到很多历史的慢查询操作命令
在生产环境中,不管slowlog-max-len设置多大,当慢查询命令逐步增多时,最开始的慢查询命令会被丢掉
当需要查询历史数据时,这些慢查询命令都是非常关键的 可以使用开源软件来实现这些功能,对于分析解决Redis问题是非常有帮助的

Pipline

Pipeline就是把一批命令进行打包,然后传输给server端进行批量计算,然后按顺序将执行结果返回给client端,从而节省网络传输时间的开销。

如:

package main

import (
    "github.com/go-redis/redis"
    "fmt"
)

func main() {
    client := redis.NewClusterClient(&redis.ClusterOptions{
        Addrs: []string{"192.168.120.110:6380", "192.168.120.111:6380"},
        ReadOnly: true,
        RouteRandomly: true,
    })

    pipe := client.Pipeline()
    pipe.HGetAll("1371648200")
    pipe.HGetAll("1371648300")
    pipe.HGetAll("1371648400")
    cmders, err := pipe.Exec()
    if err != nil {
        fmt.Println("err", err)
    }
    for _, cmder := range cmders {
        cmd := cmder.(*redis.StringStringMapCmd)
        strMap, err := cmd.Result()
        if err != nil {
            fmt.Println("err", err)
        }
        fmt.Println("strMap", strMap)
    }
}

注:

  • 首先要注意每次pipeline携带数据量不能太大
  • Pipeline可以提高Redis批量处理的并发的能力,但是并不能无节制的使用
  • 如果批量执行的命令数量过大,则很容易对网络及客户端造成很大影响,此时可以把命令分割,每次发送少量的命令到服务端执行
  • Pipeline每次只能作用在一个Redis节点上

发布订阅 Pub/Sub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值