redis pipeline

1 Pipeline概念

Redis客户端执行一条命令的流程如下

  1. 发送命令
  2. 命令排队
  3. 命令执行
  4. 返回结果

其中步骤1+步骤4所使用的时间称为往返时间(Round trip time) RTT

Redis提供了部分批量操作的命令,例如mget、mset,但是还有很多操作是不能批量进行的,例如要执行n次hgetall 或者n次del操作,那么需要消耗n次RTT。在比较极端的条件下,例如机房比较远,那么1s能执行的客户端命令是极其有限的,这和Redis的高并发高吞吐量背道而驰

Pipeline就能改善此类问题,Redis pipeline将多条命令组装,一次性发给Redis服务端,命令执行完成后再一次性返回结果,原本n条命令需要n*RTT时间(假设每次发送的RTT相同),通过Pipeline发送后,只需要一次RTT时间,

在这里插入图片描述

2 Jedis 使用Pipeline

下面使用Jave版的Jedis客户端演示使用Pipeline进行批量删除操作

  // 批量删除
  void batchDel(String...keys){
    Jedis jedis = null;
    try {
      jedis = jedisSentinelPool.getResource();
      Pipeline pipeline = jedis.pipelined();
      for(String key : keys){
        jedis.del(key);
      }
      pipeline.sync();
    }finally {
      if(jedis != null){
        jedis.close();
      }
    }
  }

  // 批量删除并返回结果
  void batchDelWithResult(String...keys){
    Jedis jedis = null;
    try {
      jedis = jedisSentinelPool.getResource();
      Pipeline pipeline = jedis.pipelined();
      for(String key : keys){
        jedis.del(key);
      }
      List<Object> result = pipeline.syncAndReturnAll();
      // 如果是成功删除两个key,输出结果为
      // ok
      // ok  
      for (Object object : result) {
        System.out.println(object);
      }
    }finally {
      if(jedis != null){
        jedis.close();
      }
    }
  }
3 tips

Pipeline虽然好用,但是每次Pipeline组装的命令个数不能没有节制,否则一次组装Pipeline数据量过大,一方面会增加客户端的等待时间,另一方面会造成一定的网络阻塞,可以将一次包含大量命令的Pipeline拆分成多次较小的Pipeline来完成。
RedisCluster对Pipeline的支持有所限制,Pipeline执行的所有命令key值通过hash函数映射到的slot值必须相同,不然Pipeline不能执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值