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显然更快。极大的缩短了命令的执行时间,提示了性能。

redis Pipeline线程安全问题 redispipeline原理_System