返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >redis cluster支持pipeline的实现思路
  • 735
分享到

redis cluster支持pipeline的实现思路

2024-04-02 19:04:59 735人浏览 安东尼
摘要

什么是pipeLine 为什么使用pipeLine ? 上篇文章给大家介绍过Redis为什么要提供pipeline功能 今天给大家普及redis cluster如

什么是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 的提交代码

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

--结束END--

本文标题: redis cluster支持pipeline的实现思路

本文链接: https://lsjlt.com/news/128986.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • redis cluster支持pipeline的实现思路
    什么是pipeLine 为什么使用pipeLine ? 上篇文章给大家介绍过redis为什么要提供pipeline功能 今天给大家普及redis cluster如...
    99+
    2024-04-02
  • redis实现共同好友的思路详解
    目录背景共同好友实现思路交集并集差集更多set命令说明:背景 ​ 微信朋友圈的点赞、评论,只能看到自己好友的信息。这就涉及到了一个共同好友的概念,通过redis的set集...
    99+
    2024-04-02
  • phpcms输入后台内容录入框中支持php代码实现思路
    extention.func.php中添加 复制代码代码如下: function templateQ($html, $format = 1) { if (1 == $format) {// <!--Q^php co...
    99+
    2022-06-12
    录入框 支持php
  • Golang 实现 Redis系列(六)如何实现 pipeline 模式的 redis 客户端
    本文的完整代码在github.com/hdt3213/godis/redis/client 通常 TCP 客户端的通信模式都是阻塞式的: 客户端发送请求 -> 等待服务端响应 ...
    99+
    2024-04-02
  • k8s部署redis cluster集群的实现
    目录Redis 介绍为什么要用Redis什么是Redis Cluster集群k8s以StatefulSet方式部署redis cluster集群:部署nfs创建pv部署redis初始...
    99+
    2024-04-02
  • Vuex数据持久化实现的思路与代码
    什么是vuex vuex :是一个专为vue.js开发的状态管理器,采用集中式存储的所有组件状态 五个属性: state、getters、mutations、actions、mod...
    99+
    2024-04-02
  • Golang如何实现 pipeline 模式的 redis 客户端
    这篇文章主要介绍“Golang如何实现 pipeline 模式的 redis 客户端”,在日常操作中,相信很多人在Golang如何实现 pipeline 模式的 redis 客户端问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
    99+
    2023-06-20
  • Redis Cluster集群动态扩容的实现
    目录一、引言 二、Cluster集群增加操作1、动态增加Master主服务器节点 2、动态增加Slave从服务器节点 三、Cluster集群删除操作 1、动态删除Slave从服务器节...
    99+
    2024-04-02
  • redis 实现登陆次数限制的思路详解
    title: redis-login-limitation  利用 redis 实现登陆次数限制, 注解 + aop, 核心代码很简单. 基本思路 比如希望达到的要求是这样: 在 1min 内登...
    99+
    2024-04-02
  • Redis的Cluster集群搭建的实现步骤
    目录一、引言二、Redis的Cluster模式介绍1、Redis群集101 2、Redis群集TCP端口 3、Redis集群和Docker 4、Redis集群数据分片 5、Redis...
    99+
    2024-04-02
  • android实现支付宝咻一咻的几种思路方法
    支付宝咻一咻在过年的时候很火热。那么咻一咻具体有哪些实现方式呢?下面我们将一一介绍这几种思路的实现过程。 1.自定义View实现咻一咻 那么这种实现方法需要掌握Canvas以...
    99+
    2022-06-06
    方法 咻一咻 支付宝 Android
  • springboot支持https请求的实现
    目录前言一、借助keytools二、详细步骤三、配置spring项目支持https总结前言 众所周知,http是不安全的协议,那么要使服务器支持https,该如何在spring项目中...
    99+
    2023-01-28
    springboot https请求 springboot https
  • 基于redis实现的点赞功能设计思路详解
    前言 点赞其实是一个很有意思的功能。基本的设计思路有大致两种, 一种自然是用mysql等 数据库直接落地存储, 另外一种就是利用点赞的业务特征来扔到redis(或memcache)中, 然后离线刷回mysq...
    99+
    2022-06-04
    详解 思路 功能设计
  • apache下支持asp.net的实现方法
    这期内容当中小编将会给大家带来有关apache下支持asp.net的实现方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。让apache支持asp.net的设置步骤。 1.安装.netframework(...
    99+
    2023-06-05
  • SpringBoot中支持Https协议的实现
    目录一、https 简介二、获取 https 证书三、在 SpringBoot 中引入 https四、请求转发一、https 简介 超文本传输安全协议(HyperText Trans...
    99+
    2023-01-28
    SpringBoot支持Https协议 SpringBoot Https协议
  • Redis Cluster如何实现写安全的重要特性
    本篇内容介绍了“Redis Cluster如何实现写安全的重要特性”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有...
    99+
    2024-04-02
  • 在Redis集群中使用pipeline批量插入的实现方法
    由于项目中需要使用批量插入功能, 所以在网上查找到了Redis 批量插入可以使用pipeline来高效的插入, 示例代码如下: String key = "key"; Jedis jedis = new...
    99+
    2024-04-02
  • Salesforce平台支持多租户Multi tenant的核心设计思路是什么
    本篇文章给大家分享的是有关Salesforce平台支持多租户Multi tenant的核心设计思路是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。多租户技术是云用于经济高效...
    99+
    2023-06-03
  • Springboot支持Emoji表情的实现方法
    前言 本篇的实现方式是 仅需后端处理,且不涉及数据库的存储编码格式修改。 正文 效果展示图: 传参 转化存储: 解析返回页面显示: 开始 1. pom.xml加入依赖 : ...
    99+
    2024-04-02
  • C++实现支持泛型的LFU详解
    首先定义LFU存储数据节点ListNode的结构, 此结构支持键K和值V的模板,为了在有序元素中实现比较(严格小于),这里需要重载小于号,如果此数据的使用频次最少,则小于结果为tru...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作