前言
终于来了,Redis 进阶篇第一篇。关于 Redis 的慢查询,是的,好哥哥们你没看错,就是慢查询。没想到吧,你不会以为只有像 mysql 等数据库有慢查询吧。
你看看这不是学到了吗(好了好了,别打了,知道各位猛男好哥哥会)。是不是很期待呀,反正我以前是不知道的。那么让我们开冲。 冲冲冲…
概述
Mysql 的慢查询我想各位好哥哥都很熟悉了,那所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来。这功能这么香,我大 Redis 怎么可能会没有。
生命周期
在 Redis 中,执行一条命令可以拆分成四个步骤发送命令、命令排队、命令执行、结果响应,需要注意的是 Redis 中的慢查询只会统计第三个步骤(命令执行)。我画你猜
最佳实践
那问题来了,我们要怎么像 Mysql 一样设置一个时间,超过这个时间的就记录到慢查询日志里面呢?要怎么看这些慢查询日志呢?猛男我已经帮好哥哥们整理好了。
1 配置阈值
Redis 提供了lowlog-log-slower-than配置来设置预设阀值,它的单位是微秒(1 秒=1000 毫秒=1000000 微秒),默认值是 10000,假如执行了一条“很慢”的命令(例如 keys*),如果它的执行时间超过了 10000 微秒,那么它将被记录在慢查询日志中。
需要注意的是如果 slowlog-log-slower-than=0 会记录所有的命令,slowlog-log-slower-
than<0 对于任何命令都不会进行记录。
2 日志存放
Redis 提供了slowlog-max-len命令,看字面意思只是说明了慢查询日志最多存储多少条,并没有说明存放在哪里是吧。是的,好哥哥们是对的。实际上 Redis 使用了一个列表来存储慢查询日志,slowlog-max-len 就是列表的最大长度。一个新的命令满足慢查询条件时被插入到这个列表中,当慢查询日志列表已处于其最大长度时,最早插入的一个命令将从列表中移出,例如 slowlog-max-len 默认设置为 128,当有第 129 条慢查询插入的话,那么队头的第一条数据就出列,第 129 条慢查询就会入列。
3 配置
Redis 提供了两种方式来该配置,第一种修改启动配置文件,这种方式的话需要找到好哥哥对应启动的 Redis 配置(千万别搞错了,不然试不出来的)。例如我的配置在/home/redis-4.0.0,然后执行下面的命令。连执行顺序、敲什么都弄出来了,确定不关注点赞吗(还没有点赞加关注的都是渣男,喜欢白嫖。哎哎哎,好了,别打了别打了)。
另一种是使用 config set 命令动态修改,这种方式的最好不要用默认的配置文件启动,不然持久化配置的时候会报错的(亲测)。
第一种
## 编辑配置,当然你可以使用linux的其他修改命令
vim redis.conf
## 打开后使用英文/进行搜索
/slowlog-log-slower-than
## 这个时候就能找到了,然后就是修改值按i编辑设置成1秒
slowlog-log-slower-than 1000000
## 按ESC键退出编辑,然后保存,重启Redis,还不会重启,看我第二篇Linux、docker Redis安装与配置就好了
:wq
第二种
## 进入redis客户端
redis-cli
## 动态配置超时时间为1秒
config set slowlog-log-slower-than 1000000
## 动态配置对列长度为500
config set slowlog-max-len 500
## 持久化写入配置文件
config rewrite
4 获取日志
哎,好哥哥是不是也发现了,刚刚说的日志是存在队列中,那也没告诉我在哪个队列呀,我要怎么拿日志呢。嘿呀,Antirez 早就帮我们想好了(Antirez yyds)。提供以下的命令能获取到对应的慢查询日志。
## 格式。n代表条数
slowlog get [n]
## 格式。查看有多少条日志
slowlog len
## 格式。重置日志
slowlog reset
5 日志解析
执行上面的命令会返回如图内容,分别是慢查询日志的标识 id、执行时间戳、命令耗时、执行命令和参数(这个好哥哥们真的要实操一下,不然真的不会呀)。
建议
- 线上建议调大慢查询列表参数 slowlog-max-len,记录慢查询时 Redis 会对长命令做截断操作,并不会占用大量内存。增大慢查询列表可以减缓慢查询被剔除的可能。
- slowlog-log-slower-than 配置默认值超过 10 毫秒判定为慢查询,需要根据 Redis 并发量调整该值。由于 Redis 是单线程的,建议这个参数配置的低一点。
- 慢查询只记录命令执行时间,并不包括命令排队和网络传输时间。因此客户端执行命令的时间会大于命令实际执行时间。
- 由于慢查询日志是一个先进先出的队列,也就是说如果慢查询比较多的情况下,可能会丢失部分慢查询命令,为了防止这种情况发生,可以定期执行 slow get 命令将慢查询日志持久化到其他存储中(例如 MySQL)。
本期就到这啦,有不对的地方欢迎好哥哥们评论区留言,另外求关注、求点赞