redis之管道——pipeline

redis 是 CS 模式,Redis客户端与Redis之间使用TCP协议进行连接,一个客户端可以通过一个socket连接发起多个请求命令,每个请求命令发出后client通常会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client,因此当执行多条命令的时候都需要等待上一条命令执行完毕才能执行。如果一次性批量数据单次操作,会有网络延迟。而redis也是单线程的。

而Pipelining可以满足批量的操作,把多个命令连续的发送给Redis Server,然后一一解析响应结果。Pipelining可以提高批量处理性能,提升的原因主要是TCP连接中减少了“交互往返”的时间

具体实现:
Pipeline pipeline =
jedis.pipelined();
// 循环添加 1000个元素
for(int i = 0; i < 1000; i++){ pipeline.rpush("rediskey", i + ""); }
//执行 
pipeline.sync()
Pipeline 操作:request request  request  — — — — — response response response
单次操作:request —response  request —response request —response

对于 pipeline 是不能有其它操作,结果也不能一下返回,需要等批量操作结果全部一起返回。有些系统可能对可靠性要求很高,每次操作都需要立马知道这次操作是否成功,是否数据已经写进redis了,那这种场景就不适合操作。

对于批量将数据写入redis,允许一定比例的写入失败,那么这种场景就可以使用了,比如10万条一下进入redis,可能失败了几条无所谓,后期有补偿机制就行了,比如短信群发这种场景,如果一下群发10万条,按照第一种模式去实现,那这个请求过来,要很久才能给客户端响应,这个延迟就太长了,如果客户端请求设置了超时时间5秒,那肯定就抛出异常了,而且本身群发短信要求实时性也没那么高,这时候用pipeline最好了。

pipeline 底层是通过把所有的操作封装成流,redis有定义自己的出入输出流。在 sync() 方法执行操作,每次请求放在队列里面,解析响应包。 

猜你喜欢

转载自www.cnblogs.com/dramecj/p/10771874.html