Pipeline技术
Redis 是采用TCP协议来对外提供服务,也就是说,Redis 是基于Request/Reseonse的一种一问一答的模式,请求一次响应 一次。 客户端通过Socke连接发起请求,发送一条命令给服务器,等待服务器应答,进行处理后,返回结果。在这个过程中,每个请求在命令发出后会阻塞等待Redis服务器进行处理,处理完毕后才会将结果返回给客户端。
每条命令在发送与接收的过程中都会占用两个网络传输,在业务量非常庞大的情况下,是不能满足我们的需求的,这将严重影响Redis的性能。
比如在做大量连续的多个操作,这些操作通常是依次联系的,在这样的场景中,网络传输耗时就是一个严重的问题,Redis为了解决此类问题,引入了流水线(Pipeline),也可以称之为管道,其实就是一次性把所有的命令请求发送给服务器, 这样可以避免频繁地发送、 接收命令所带来的网络延时,减少IO调用次数。服务器在接收到一堆令后,会依次执行,然后把结果打包,一次性返回给客户端。
使用Pipeline技术的好处是节约了网络带宽,缩短了访问时间,减少了服务器I/O调用次数,提高了Redis的性能。
但是,要注意控制Pieline的大小,也就是它每次最多可以发送多少条命令的限制。过多使用将会消耗Redis的内存,并且Pipeline一次只能运行在一个Redis 节点上。
性能测试
我们在Jedis中使用Pipeline技术和不使用Pipeline进行对比.
public class Main {
public static void main(String[] args) {
/**
* 创建Jedis
*/
Jedis jedis =new Jedis("127.0.0.1",6379);
/**
* 开始时间
*/
long startTimer =System.currentTimeMillis();
/**
* 20000次随机设置
*/
for (int i = 0; i < 20000; i++) {
int rand =new Random().nextInt(1000);
jedis.set("key"+rand,"value"+rand);
}
/**
* 用时
*/
System.out.println(System.currentTimeMillis()-startTimer);
startTimer =System.currentTimeMillis();
/**
* 使用Pipeline技术,此处Pipeline大小为100,也就是每次同时发送100条命令给服务器,循环200次
*/
for (int i = 0; i < 200; i++) {
Pipeline pipelined = jedis.pipelined();
for (int j = 0; j < 100; j++) {
int rand =new Random().nextInt(1000);
pipelined.set("key"+rand,"value"+rand);
}
/**
* 在结束时必须加
*/
pipelined.syncAndReturnAll();
}
System.out.println(System.currentTimeMillis()-startTimer);
}
}
经过上面测,同样调用set对随机健设置随机值,使用Pipeline显然更快。极大的缩短了命令的执行时间,提示了性能。