当我们要操作一批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 逻辑了

伪代码

List<Integer, HostAndPort> slot2NodeMap; // 缓存可以通过主动调用Jedis.clusterNodes获取slot映射关系,并缓存在本地
List<String> keys // 需要批处理的key
Map<HostAndPort, List<String>> node2Keys= new HashMap<>(); // 节点对应keys分组
for(String key : keys) {
// 计算key对应的slot
int slot = JedisClusterCRC16.getSlot(key);
// 根据slot获取对应的节点信息
node2Keys.get(slot2NodeMap.get(slot)).add(key);
} // 分组执行
for (Map.Entry<HostAndPort, List<String>> group : node2Keys) {
Jedis jedis = JedisClusterConnectionHandler.getConnectionFromNode(group.key);
jedis.pipelined();
// 执行本组keys
jedis.sync();
}
// 结果聚合

注意:在 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的更多相关文章

  1. redis cluster下的pipeline

    因为key在cluster分布在不同的slot,可能在不同的机器,部分redis的客户端(比如jedis)是不支持pipeline的 针对jedis我们可能要先把这些key对应的slot手机起来,得到 ...

  2. 高可用Redis(十二):Redis Cluster

    Redis Cluster是Redis官方提供的Redis集群功能 1.为什么要实现Redis Cluster 1.主从复制不能实现高可用 2.随着公司发展,用户数量增多,并发越来越多,业务需要更高的 ...

  3. 高可用Redis:Redis Cluster

    转(https://www.cnblogs.com/renpingsheng/p/9862485.html) Redis Cluster是Redis官方提供的Redis集群功能 1.为什么要实现Red ...

  4. Redis服务之Redis Cluster

    在上一篇博客中我们聊到了redis的高可用组件sentinel的相关配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13429776.html:sentin ...

  5. Redis Cluster集群知识学习总结

    Redis集群解决方案有两个: 1)  Twemproxy: 这是Twitter推出的解决方案,简单的说就是上层加个代理负责分发,属于client端集群方案,目前很多应用者都在采用的解决方案.Twem ...

  6. redis cluster 集群畅谈(三) 之 水平扩容、slave自动化迁移

    上一篇http://www.cnblogs.com/qinyujie/p/9029522.html, 主要讲解 实验多master写入.读写分离.实验自动故障切换(高可用性),那么本篇我们就来聊了聊r ...

  7. redis cluster 集群畅谈(二)

    上一篇http://www.cnblogs.com/qinyujie/p/9029482.html, 主要讲解 redis cluster 集群 搭建,本篇主要讲解实验多master写入.读写分离.实 ...

  8. Redis Cluster实现原理

    一.Redis Cluster主要特性和设计     集群目标 1)高性能和线性扩展,最大可以支撑到1000个节点:Cluster架构中无Proxy层,Master与slave之间使用异步replic ...

  9. 搭建分布式 Redis Cluster 集群与 Redis 入门

    目录 Redis 集群搭建 Redis 是啥 集群(Cluster) Redis Cluster 说明 Redis Cluster 节点 Redis Cluster 集群模式 不能保证一致性 创建和使 ...

随机推荐

  1. 矩阵旋转-Eigen应用(QTCreator编辑器)

    * { font-family: "Tibetan Machine Uni", "sans-serif", STFangSong; outline: none ...

  2. .NET 反射(Reflection)

    这节讲一下.NET 中的一个技术:反射(Reflection). 反射是一种很重要的技术,它可以在程序运行时,动态的获取类的实例,并调用实例中的任何方法.它就像一面镜子,映射出一个类的所有细节.    ...

  3. base64stego 还不懂base64的隐写,详解15行代码带你领略

    网上写了好多关于xctf MISC新手篇的base64Stego隐写的教程,但大都不太清楚,基本上都是讲了一段隐写原理,直接上代码了.但是代码是这道题的关键,代码讲了如何解码这个隐写的完整流程,这次我 ...

  4. TypeScript 中限制对象键名的取值范围

    当我们使用 TypeScript 时,我们想利用它提供的类型系统限制代码的方方面面,对象的键值,也不例外. 譬如我们有个对象存储每个年级的人名,类型大概长这样: type Students = Rec ...

  5. 事后分析$\alpha$

    项目 内容 课程:北航-2020-春-软件工程 博客园班级博客 要求 事后分析 我们在这个课程的目标是 提升团队管理及合作能力,开发一项满意的工程项目 这个作业在哪个具体方面帮助我们实现目标 组织组员 ...

  6. 对ansible不支持service模块的status命令进行修正

    原生的ansible不支持service.status,在Google之后,发现有人提交了一个patch,可以支持status选项.见https://github.com/ritzk/ansible- ...

  7. CentOS下cpu分析 top

    CentOS下 cpu 分析-top 时间:2017-03-20 12:09来源:linux.it.net.cn 作者:IT   一. 前言 我们都知道windows下对各个运行的任务,要通过任务管理 ...

  8. 云计算OpenStack---创建实例(11)

    创建实例时,需要先创建网络及实例类型等其它配置: 一.创建虚拟网络(Self-service network) 网络概述图: 网络连接图: 1.创建self-service网络 (1)加载系统变量: ...

  9. java 并发包JUC下的CountDownLatch和CyclicBarrier的理解和区别

    推荐这篇帖子,讲得不错~ https://blog.csdn.net/liangyihuai/article/details/83106584

  10. system verilog内建数据类型