redis cluster支持pipeline的实现思路


Posted in Redis onJune 23, 2021

什么是pipeLine 为什么使用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

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

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

以上就是redis cluster支持pipeline的实现思路的详细内容,更多关于redis cluster支持pipeline的资料请关注三水点靠木其它相关文章!

Redis 相关文章推荐
解决redis sentinel 频繁主备切换的问题
Apr 12 Redis
基于Redis过期事件实现订单超时取消
May 08 Redis
Redis高级数据类型Hyperloglog、Bitmap的使用
May 24 Redis
Windows中Redis安装配置流程并实现远程访问功能
Jun 07 Redis
k8s部署redis cluster集群的实现
Jun 24 Redis
Redis集群的关闭与重启操作
Jul 07 Redis
redis 存储对象的方法对比分析
Aug 02 Redis
Jedis操作Redis实现模拟验证码发送功能
Sep 25 Redis
解决 redis 无法远程连接
May 15 Redis
Redis基本数据类型String常用操作命令
Jun 01 Redis
关于Redis的主从复制及哨兵问题
Jun 16 Redis
如何使用注解方式实现 Redis 分布式锁
Jul 23 Redis
了解Redis常见应用场景
Jun 23 #Redis
压缩Redis里的字符串大对象操作
你真的了解redis为什么要提供pipeline功能
Redis缓存-序列化对象存储乱码问题的解决
比较几种Redis集群方案
解析Redis Cluster原理
解析高可用Redis服务架构分析与搭建方案
You might like
怎样在PHP中通过ADO调用Asscess数据库和COM程序
2006/10/09 PHP
PHP开发中csrf攻击的简单演示和防范
2017/05/07 PHP
详解PHP队列的实现
2019/03/14 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
2020/04/26 PHP
使用jquery获取网页中图片高度的两种方法
2013/09/26 Javascript
Eclipse去除js(JavaScript)验证错误
2014/02/11 Javascript
js调用浏览器打印模块实现点击按钮触发自定义函数
2014/03/21 Javascript
JS来动态的修改url实现对url的增删查改
2014/09/05 Javascript
Jquery实现简单的轮播效果(代码管用)
2016/03/14 Javascript
jQuery表单事件实例代码分享
2016/08/18 Javascript
jQuery simpleModal插件的使用介绍
2016/08/30 Javascript
ReactJs快速入门教程(精华版)
2016/11/28 Javascript
用Nodejs搭建服务器访问html、css、JS等静态资源文件
2017/04/28 NodeJs
js下载文件并修改文件名
2017/05/08 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
详细分析vue响应式原理
2020/06/22 Javascript
React服务端渲染原理解析与实践
2021/03/04 Javascript
[55:23]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
python线程池threadpool使用篇
2018/04/27 Python
python3 unicode列表转换为中文的实例
2018/10/26 Python
详解js文件通过python访问数据库方法
2019/03/03 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
2019/07/08 Python
PyQtGraph在pyqt中的应用及安装过程
2019/08/04 Python
Python修改列表值问题解决方案
2020/03/06 Python
Django配置跨域并开发测试接口
2020/11/04 Python
Python数据模型与Python对象模型的相关总结
2021/01/26 Python
英国最专业的健身器材供应商之一:Best Gym Equipment
2017/12/22 全球购物
泰国折扣酒店预订:Hotels2Thailand
2018/03/20 全球购物
巴西Bo.Bô官方在线商店:经营奢侈品时尚业务
2020/03/16 全球购物
澳大利亚网上书店:QBD
2021/01/09 全球购物
单位未婚证明范本
2014/01/18 职场文书
摄影助理岗位职责
2014/02/07 职场文书
基层干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014年妇幼卫生工作总结
2014/12/09 职场文书
2016春季幼儿园大班开学寄语
2015/12/03 职场文书