【Redis】---Redis管道Pipeline

目录

  • 一、pipeline请求模型
  • 二、pipeline管道技术原理
  • 三、pipeline管道源码
    • 3.1、ShardedJedisPipeline原理分析

一、pipeline请求模型

它能将一组 Redis 命令进行组装,通过一次传输给 Redis 并返回结果集。
【Redis】---Redis管道Pipeline_第1张图片
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 list = pipeline.syncAndReturnAll();
 
  

下面截取一些关键的代码进行分析

    ------- ShardedJedisPipeline pipeline = getShardedJedis().pipelined();
       
         public ShardedJedisPipeline pipelined() {
            ShardedJedisPipeline pipeline = new ShardedJedisPipeline();
            pipeline.setShardedJedis(this);
            return pipeline;
         }
         //  从pipelined()方法看出,将当前获取“TCP物理连接”给这个管道。

    public List syncAndReturnAll() {
        List 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 zscore(String key, String member) {
           this.getClient(key).zscore(key, member);
           return this.getResponse(BuilderFactory.DOUBLE);
        }
``
  protected  Response getResponse(Builder builder) {
          Response 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;
    }
`

 
  

                            
                        
                    
                    
                    

你可能感兴趣的:(redis)