redis学习记录06-pipeline

本文介绍了 Redis 中 Pipeline 的概念及其执行过程,并通过对比 Pipeline 模式与非 Pipeline 模式的速度测试,展示了 Pipeline 在批量处理命令时能显著提高执行效率。此外还讨论了 Pipeline 的适用场景及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念:非事务型流水线

执行过程

非pipleline模式:
Request---->执行
---->Response
Request---->执行
---->Response
Pipeline模式下:
Request---->执行,Server将响应结果队列化
Request---->执行,Server将响应结果队列化
---->Response
---->Response

速度测试

public static void main(String[] args) {
        long start = System.currentTimeMillis();
        withoutPipeline();
        long end = System.currentTimeMillis();
        System.out.println(end - start);
        start = System.currentTimeMillis();
        usePipeline();
        end = System.currentTimeMillis();
        System.out.println(end - start);
    }

    private static void withoutPipeline(){
        Jedis jedis = new Jedis("192.168.95.128", 6379);
        for (int i = 0; i < 10000; i++){
            jedis.incr("npip");
        }
        jedis.quit();
    }

    private static void usePipeline(){

        Jedis jedis = new Jedis("192.168.95.128", 6379);
        Pipeline pipline = jedis.pipelined();
        for (int i = 0; i < 10000; i++){
            pipline.incr("hpip");
        }
        pipline.syncAndReturnAll();
        jedis.quit();
    }

结果

3831
50

结论

当使用了大量命令一起操作的时候,引入pipeline 会使得 执行速度大量提高,类似关系型数据库中的批处理.

使用场景

Pipeline在某些场景下非常有用,比如有多个command需要被“及时的”提交,而且他们对相应结果没有互相依赖,而且对结果响应也无需立即获得,那么pipeline就可以充当这种“批处理”的工具;而且在一定程度上,可以较大的提升性能,性能提升的原因主要是TCP链接中较少了“交互往返”的时间。
不过在编码时请注意,pipeline期间将“独占”链接,此期间将不能进行非“管道”类型的其他操作,直到pipeline关闭;比如在上述代码中间,使用jedis.set(key,value)等操作都将抛出异常。
如果你的pipeline的指令集很庞大,为了不干扰链接中的其他操作,你可以为pipeline操作新建Client链接,让pipeline和其他正常操作分离在2个client中。不过pipeline事实上所能容忍的操作个数,和socket-output缓冲区大小/返回结果的数据尺寸都有很大的关系;同时也意味着每个redis-server同时所能支撑的pipeline链接的个数,也是有限的,这将受限于server的物理内存或网络接口的缓冲能力。

与事务的关系

pipeline和“事务”是两个完全不同的概念,pipeline只是表达“交互”中操作的传递的方向性,pipeline也可以在事务中运行,也可以不在。无论如何,pipeline中发送的每个command都会被server立即执行,如果执行失败,将会在此后的相应中得到信息;也就是pipeline并不是表达“所有command都一起成功”的语义;但是如果pipeline的操作被封装在事务中,那么将有事务来确保操作的成功与失败

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值