慢查询分析
慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过所设置的阈值,就会把这条命令的相关信息记录下来,比如:消耗时间等。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()
详细用法可以参考官方文档:
网友评论