一、pipeline请求模型
它能将一组 Redis 命令进行组装,通过一次传输给 Redis 并返回结果集。
client将一组redis命令封装要使用pipeline,命令先进入pipeline缓冲区,该缓冲区会将一批命令一同flush到redis服务器【默认53个命令就会flush】,再一同返回结果;接着将缓冲区其他的命令也是分批次send,只有所有的命令结果返回,然后一同返回结果给client。
二、pipeline管道技术原理
一般的请求:客户端向redis服务器发送请求,以阻塞方式等待redis服务器的响应结果。
客户端进程调用write()把消息写入send buffer中;
操作系统将send buffer内容发送到redis服务器网卡;
Redis服务器接收消息写入recv buffer中;
Redis服务器调用read()读取消息并处理,处理结果也是类似上面的操作返回;
pipeline管道技术原理:是让客户端在请求未得到响应时,依然可以发送下一个请求,这样多个命令就可以如同批次一样到达服务端,服务端按顺序进行处理,最后统一响应。
为了实现统一响应功能,client有一个缓冲区,一定数量的请求按照队列顺序批量发送到redis服务端,再这批请求未得到响应前,继续批量发送下一批请求,最终所有的请求结果返回到缓冲区,然后结果统一响应。
三、pipeline管道源码
3.1、ShardedJedisPipeline原理分析
ShardedJedisPipeline管道:建立一个Jedis【即一个TCP网络连接】,在这个连接中进行多次子查询。所以降低的是网络连接通信的时间。
这是一小段管道的代码
ShardedJedisPipeline pipeline = getShardedJedis().pipelined();
for (String value : values) {
pipeline.zscore(key, value);
}
List<Object> list = pipeline.syncAndReturnAll();
下面截取一些关键的代码进行分析
------- ShardedJedisPipeline pipeline = getShardedJedis().pipelined();
public ShardedJedisPipeline pipelined() {
ShardedJedisPipeline pipeline = new ShardedJedisPipeline();
pipeline.setShardedJedis(this);
return pipeline;
}
// 从pipelined()方法看出,将当前获取“TCP物理连接”给这个管道。
public List<Object> syncAndReturnAll() {
List<Object> formatted = new ArrayList();
Iterator i$ = this.clients.iterator();
while(i$.hasNext()) {
Client client = (Client)i$.next();
//这个就是按照顺序获取到返回结果
formatted.add(this.generateResponse(client.getOne()).get());
}
return formatted;
}
public Response<Double> zscore(String key, String member) {
this.getClient(key).zscore(key, member);
return this.getResponse(BuilderFactory.DOUBLE);
}
``
protected <T> Response<T> getResponse(Builder<T> builder) {
Response<T> lr = new Response(builder);
this.pipelinedResponses.add(lr);
return lr;
}
//从上面可以看出,将每个子查询按照Queue[LinkedList()]进行保存,所以保证顺序返回结果
protected Client getClient(String key) {
//获取到这个key对应到哪个Redis服务器节点上
Client client = ((Jedis)this.jedis.getShard(key)).getClient();
this.clients.add(client);
this.results.add(new ShardedJedisPipelineAnalyse.FutureResult(client));
return client;
}
`
版权声明:本文为xunmengyou1990原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。