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

2019-08-13  本文已影响0人  落羽归尘

慢查询分析

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

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

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()

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

上一篇 下一篇

猜你喜欢

热点阅读