Redis管道机制pipeline

young 517 2021-10-18

管道机制

Jedis jedis = new Jedis("192.168.8.211",6379);
long start = System.currentTimeMillis();
for(int i=0;i<10000;i++){
    jedis.set("key"+i,i+"");
}
long end = System.currentTimeMillis();
System.out.println(end-start);
jedis.close();

耗时很久

redis采用C/S模型,request/response的tcp服务器,每次请求,阻塞等待服务端响应,执行多个命令时,需要等待上一条命令完毕。通信的时候也存在网络的延迟。而且也会导致服务端的IO过多。

pipeline通过一个队列,将命令缓存起来,然后把这个命令一次发送给服务端

Jedis jedis = new Jedis("192.168.8.211",6379);
Pipeline pipeline = jedis.pipeline();
long start = System.currentTimeMillis();
for(int i=0;i<1000000;i++){
    pipeline.set("batch"+i,i+"");
}
pipeline.syncAndReturnAll();
long end = System.currentTimeMillis();
System.out.println(end-start);
jedis.close();

命令会缓存在客户端,会对客户端内存有消耗

Jedis默认客户端累计8192个字节后会发送一次。返回的数据会放在客户端的接收缓冲区,客户端的接收缓冲区满了,客户端就会告诉服务端,服务端就会将结果放在服务端的输入缓冲区。

批量写入数据,对结果的实时性要求不高,就可以使用pipeline