纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

redis cluster支持pipeline redis cluster支持pipeline的实现思路

mushishi   2021-06-23 我要评论
想了解redis cluster支持pipeline的实现思路的相关内容吗mushishi在本文为您仔细讲解redis cluster支持pipeline的相关知识和一些Code实例欢迎阅读和指正我们先划重点:redis,cluster支持pipeline,redis,cluster,pipeline下面大家一起来学习吧

什么是pipeLine 为什么使用pipeLine ?

上篇文章给大家介绍过redis为什么要提供pipeline功能 今天给大家普及redis cluster如何支持pipeline?

管道(pipeline)将客户端 client 与服务器端的交互明确划分为单向的发送请求(Send Request)和接收响应(Receive Response):用户可以将多个操作连续发给服务器但在此期间服务器端并不对每个操作命令发送响应数据;全部请求发送完毕后用户关闭请求开始接收响应获取每个操作命令的响应结果

管道(pipeline)在某些场景下非常有用比如有多个操作命令需要被迅速提交至服务器端但用户并不依赖每个操作返回的响应结果对结果响应也无需立即获得那么管道就可以用来作为优化性能的批处理工具性能提升的原因主要是减少了 TCP 连接中交互往返的开销

不过在程序中使用管道请注意使用 pipeline 时客户端将独占与服务器端的连接此期间将不能进行其他“非管道”类型操作直至 pipeline 被关闭;如果要同时执行其他操作可以为 pipeline 操作单独建立一个连接将其与常规操作分离开来

当我们要操作一批key时可以通过 redis pipline 再执行完后一次性读取所有结果来较少网络传输的消耗; 很明显这有个限制条件 => 这批key的执行必须在同一个连接上

当部署的redis为 standalone 或 master-slave 结构的时候还好可以从 pool 取出来的连接都是一个 master 节点的 那要是 redis cluster 的时候怎么办? 这批key 可能在同一个 redis node 也可能分散在多个 redis nodes 这样就是多个连接了

redis cluster 虽然自动对 key 进行了分片但是它对 client 的要求比较高需要客户端连接所有 cluster 内的节点(这个和 db client方案类似)并缓存 slots分配信息然后在客户端采用同样的算法进行hash后定位 key 的 slot 进而定位 slot 所属的 redis 节点然后获取对应节点的连接发送命令

cluster pipeline 实现思路

java 常用的客户端 jedis虽然提供了 redis-cluster 功能但是并没有提供 cluster 下的 pipeline 能力我们借助它封装好的 JedisClusterCRC16 工具去计算 slot 定位对应 redis node 的连接按照 redis node 将这批 key 进行分组 那么每组 key 就能分别进行 pipeline 逻辑了

伪代码

static List<Integer, HostAndPort> slot2NodeMap; // 可以通过主动调用Jedis.clusterNodes获取slot映射关系并缓存在本地

List<Object> clusterPipeline(List keys) {
	 Map<HostAndPort, List<String>> node2Keys= new HashMap<>();  // 节点对应keys分组
	for(String key : keys) {
	   // 计算key对应的slot
	   int slot = JedisClusterCRC16.getSlot(key); 
	   // 根据slot获取对应的节点信息将同一节点的key收在一组
	  node2Keys.get(slot2NodeMap.get(slot)).add(key);
	}

    List<Object> results = new ArrayList();
	// 分组执行
	for (Map.Entry<HostAndPort, List<String>> group : node2Keys) {
		Jedis jedis =  JedisClusterConnectionHandler.getConnectionFromNode(group.key);
		PipeLine pipeline = jedis.pipelined();
		// 执行本组keys 
		 result.addAll(jedis.syncAndReturnAll());
	}
   return results;
}

注意:在 cluster 上执行 pipeline 可能会由于 redis 节点扩缩容 中途 redirection 切换连接导致结果丢失; 可以把 attempts 重试次数设为0 不允许自动切换连接 以感知到异常然后业务主动进行重试

jedis 官方支持?

github 上其实2017年就有人提交了 cluster pipeline 的pr维护人员也很乐意 merge 但是~~ 后续跟进比较慢然后19年 merge review的时候有些异常提交人也没再跟进导致一直没有合并成功;
https://github.com/redis/jedis/pull/1455


实现 cluster pipeline 也可以参考这个pr 的提交代码


相关文章

猜您喜欢

  • python随机打印排名表 python随机打印成绩排名表

    想了解python随机打印成绩排名表的相关内容吗菜菜是真菜在本文为您仔细讲解python随机打印排名表的相关知识和一些Code实例欢迎阅读和指正我们先划重点:python随机打印成绩排名表,python随机打印成绩,python随机打印下面大家一起来学习吧..
  • Django Paginator分页器的使用 Django Paginator分页器的使用示例

    想了解Django Paginator分页器的使用示例的相关内容吗lyshark在本文为您仔细讲解Django Paginator分页器的使用的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Django,Paginator,Django,分页器下面大家一起来学习吧..

网友评论

Copyright 2020 www.gamerfx.net 【游戏天空】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式