在Redis集群模式下使用pipeline进行批量操作

2023-05-16

最近开始又接触到了Redis,之前在工作中使用Redis的时候,由于QPS不高,都是直接get/set搞定了。这次遇到的业务数据量比较大,更新也很频繁,Redis使用是集群模式,所以本文记录下捣鼓出来的如何在集群模式下使用pipeline进行批量操作的代码。为啥要捣鼓...因为网上找到的方法都不太靠谱

Redis集群是没法执行一些批量操作命令的,如mget,pipeline等。这是因为redis将集群划分为16384个slot,不同的key会划分到不同的slot,集群中的每个节点对应一批slot。jedis客户端并没有封装批量操作的命令。

但是在Redis集群中,每个redis节点都能单独对外提供服务。同时Jedis客户端提供了计算key的slot方法,已经slot和节点之间的映射关系,通过这两个数据,就可以计算出每个key所在的节点,然后对相同节点上的数据使用pipeline获取数据。

本人使用的redis版本是7.x,jedis客户端版本是4.3.1

如何判断key所属的节点:

首先判断key所属的slot,使用JedisClusterCRC16.getslot()方法,可以直接计算出key所属的slot。

接着就是计算slot属于哪个node了。这里的jedisCluster是创建好的集群连接,可以获取slot对应的Connection,这个Connection就是Redis单节点的连接。Connection内部会有一个变量叫privat ConnectionPool memberOf 变量记录这个连接属于哪个连接池(这里的连接池就是类似创建单节点的JedisPool)。用反射的方式去获取每个slot对应的ConnectionPool变量:

同时jedisCluster还提供了getClusterNodes()方法,对应的返回结果是Map<String,ConnectionPool> key是节点信息,value为单个节点的连接池信息。

这样,通过ConnectionPool引用的对比,就可以获取到 key -> slot -> node 这样的一串映射关系,从而也就知道了key 和 node之间的对应关系!

Redis集群执行pipeline:

知道了 key -> slot -> node 三者之间的对应关系之后,接下来的事情就很好办了。讲属于同一个node的key放到同一个List里面。然后通过jedisCluster.getClusterNodes().get(***node编号***).getResurce()方法获取单个redis节点连接池中的单个redis连接。用jedis类封装一下,就可以愉快的进行查询啦:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Redis集群模式下使用pipeline进行批量操作 的相关文章

  • sklearn pipeline + keras顺序模型-如何获取历史记录?

    Keras https keras io模型 当 fit被调用时 返回一个历史对象 如果我将此模型用作 sklearn 管道的一步 是否可以检索它 顺便说一句 我正在使用 python 3 6 提前致谢 History 回调记录每个时期的训
  • 属性错误:未找到下层;在 scikit-learn 中使用带有 CountVectorizer 的 Pipeline

    我有一个这样的语料库 X train this is an dummy example in reality this line is very long here is a last text in the training set 和一
  • Redis Cluster 与 Pub/Sub 中的 ZeroMQ,用于水平扩展的分布式系统

    如果我要设计一个巨大的分布式系统 其吞吐量应随系统中的订阅者数量和通道数量线性扩展 哪个会更好 1 Redis集群 仅适用于Redis 3 0 alpha 如果是集群模式 您可以在一个节点上发布并在另一个完全不同的节点上订阅 消息将传播并到
  • 使用 Sentinels 升级 Redis 的最佳实践?

    我有 3 个 Redis 节点 由 3 个哨兵监视 我进行了搜索 文档似乎不清楚如何最好地升级此类配置 我目前使用的是 3 0 6 版本 我想升级到最新的 5 0 5 我对这方面的程序有几个疑问 升级两个大版本可以吗 我在我们的暂存环境中执
  • Redis、会话过期和反向查找

    我目前正在构建一个网络应用程序 并想使用 Redis 来存储会话 登录时 会话会使用相应的用户 ID 插入到 Redis 中 并且过期时间设置为 15 分钟 我现在想实现会话的反向查找 获取具有特定用户 ID 的会话 这里的问题是 由于我无
  • 在 SciKit-Learn 中使用 Pipeline 计算排列重要性

    我正在使用来自的确切示例SciKit https scikit learn org stable auto examples inspection plot permutation importance html sphx glr auto
  • 如何从spark管道逻辑模型中提取变量权重?

    我目前正在尝试学习 Spark Pipeline Spark 1 6 0 我将数据集 训练和测试 导入为 oas sql DataFrame 对象 执行以下代码后 生成的模型是oas ml tuning CrossValidatorMode
  • redis - 使用哈希

    我正在使用 redis 为我的 Web 应用程序实现社交流和通知系统 我是 redis 的新手 我对哈希值及其效率有一些疑问 我读过这篇很棒的文章Instagram 帖子 http instagram engineering tumblr
  • Redis是如何实现高吞吐量和高性能的?

    我知道这是一个非常普遍的问题 但是 我想了解允许 Redis 或 MemCached Cassandra 等缓存 以惊人的性能极限工作的主要架构决策是什么 如何维持连接 连接是 TCP 还是 HTTP 我知道它完全是用C写的 内存是如何管理
  • 如何使 Redis 缓存中数据层次结构(树)的部分内容无效

    我有一些产品数据 需要在 Redis 缓存中存储多个版本 数据由 JSON 序列化对象组成 获取普通 基本 数据的过程很昂贵 将其定制为不同版本的过程也很昂贵 因此我想缓存所有版本以尽可能进行优化 数据结构看起来像这样 BaseProduc
  • 在 Redis 上为 Django 和 Express.js 应用程序共享会话存储

    我想创建一个包含一些登录用户的 Django 应用程序 另一方面 由于我想要一些实时功能 所以我想使用 Express js 应用程序 现在的问题是 我不希望身份不明的用户访问 Express js 应用程序的日期 因此 我必须在 Expr
  • 想要在后台不间断地运行redis-server

    我已经下载了 redis 2 6 16 tar gz 文件并安装成功 安装后我运行 src redis server 它工作正常 但我不想每次都手动运行 src redis server 而是希望 redis server 作为后台进程持续
  • Laravel Redis 配置

    我目前正在使用 Laravel 和 Redis 创建一个应用程序 几乎一切都工作正常 我按照文档中的说明扩展了身份验证 用户可以订阅 登录 注销 我可以创建内容 所有内容都存储在 Redis 中 但我有一个问题 我无法运行 php arti
  • ServiceStack.Redis:无法连接:sPort:

    我经常得到 ServiceStack Redis 无法连接 sPort 0 或 ServiceStack Redis 无法连接 sPort 50071 或其他端口号 当我们的网站比较繁忙时 就会出现这种情况 Redis 本身看起来很好 CP
  • 为什么单个 Redis 实例不是线程安全的?

    https github com xetorthio jedis wiki Getting started https github com xetorthio jedis wiki Getting started 在多线程环境中使用Jed
  • Redis 在键过期时更新排序集

    我有一个 Redis 服务器 其中包含一组键值对和一个排序集 提供这些键值对的键的索引 键值对可以进入 已完成 状态 此时需要在 1 小时后删除它们 这可以通过在键上设置到期时间来简单地实现 但从排序集中清除它们似乎更成问题 我可以有一个过
  • 批量将Dictionary中的数据设置到Redis中

    我正在使用 StackExchange Redis DB 插入键值对字典Batch如下 private static StackExchange Redis IDatabase database public void SetAll
  • 在redis中存储多个嵌套对象

    我想在redis中存储多个复杂的json数据 但不知道如何 这是我的 json 结构 users user01 username ally email email protected cdn cgi l email protection u
  • 为什么我们需要 Redis 来运行 CKAN?

    我想知道为什么我们需要 Redis 服务器来运行 CKAN 如果需要 为什么 我如何使用 CKAN 配置它 附注 我正在 RHEL7 中运行我的 ckan 实例 Update Redis 已成为一项要求从CKAN 2 7开始 https d
  • 为什么Redis SET性能优于GET?

    根据Redis基准 http redis io topics benchmarkss Redis 可以执行 100 000 SET 操作 秒和 80 000 GET 操作 秒 Redis 是一种内存数据库 这似乎令人惊讶 因为通常人们会认为

随机推荐

  • mysql批量更新

    这就要介绍一下在MySql中INSERT语法具有一个条件DUPLICATE KEY UPDATE xff0c 这个语法和适合用在需要判断记录是否存在 xff0c 不存在则插入存在则更新的记录 具体的语法可以参见 xff1a http dev
  • ubuntu远程桌面连接windows系统

    转载自 https www cnblogs com brainworld p 7755779 html ubuntu端 xff1a sudo apt get install rdesktop windows端 xff1a 需要允许此wind
  • Linux挂载硬盘

    原文链接 我要挂载的硬盘为sda1 xff0c 首先将硬盘插上 1 查看硬盘 使用检测硬盘命令 xff1a lsblk 看到 sda1 存在 然后使用查看硬盘命令 xff1a span class token function df spa
  • ModuleNotFoundError No module named ‘PIL‘问题解决

    原文链接 Python使用时出现报错 xff1a ModuleNotFoundError No module named PIL 该提示表示缺少pillow模块 xff0c 可以用以下命令安装 xff1a pip span class to
  • SpringBoot实现多线程

    原文链接 代码地址 xff1a https github com Snowstorm0 learn async 1 线程同步和异步 线程同步 xff1a A线程要请求某个资源 xff0c 但是此资源正在被B线程使用中 xff0c 因为同步机
  • pip安装报错:UnicodeDecodeError ‘utf-8‘ codec can‘t decode byte 0xc3 in position 4

    原文链接 使用pip命令安装模块时 xff0c 若出现报错 xff1a UnicodeDecodeError utf 8 codec can t decode byte 0xc3 in position 4 invalid continua
  • Prometheus的使用

    原文链接 Prometheus 是一个开放性的监控解决方案 xff0c 用户可以非常方便的安装和使用 Prometheus 并且能够非常方便的对其进行扩展 在Prometheus的架构设计中 xff0c Prometheus Server
  • Java中restTemplate携带Header请求

    原文链接 RestTemplate是Spring提供的用于发送HTTP请求的客户端工具 现在我们要在Java中使restTemplate携带Header请求 创建请求 创建请求头 xff1a span class token class n
  • SpringBoot整合ElasticSearch

    原文链接 ElasticSearch是个开源分布式搜索引擎 xff0c 提供搜集 分析 存储数据三大功能 它的特点有 xff1a 分布式 xff0c 零配置 xff0c 自动发现 xff0c 索引自动分片 xff0c 索引副本机制 xff0
  • Python将二维数组输出为图片

    原文链接 使用Python读取二维数组 xff0c 将二维数组输出为图片 xff0c 并保存在本地 代码如下 xff1a span class token comment coding 61 utf8 span span class tok
  • 如何使用Tin快速搭建Gitlab-ce?(史上最简单方法)

    GitLab是Git代码版本管理平台 xff0c 相比于GitHub xff0c GitLab还免费支持私人仓库 GitLab ce是gitlab的开源版本 目前网上Gitlab ce的安装方法有很多 xff0c 但大同小异都需要安装各种依
  • 堆叠降噪自动编码器 Stacked Denoising Auto Encoder(SDAE)

    原文链接 自动编码器 xff08 Auto Encoder xff0c AE xff09 自动编码器 xff08 Auto Encoder xff0c AE xff09 自编码器 xff08 autoencoder xff09 是神经网络的
  • PyTorch中 nn.Conv2d与nn.ConvTranspose2d函数的用法

    原文链接 1 通道数问题 xff1a 描述一个像素点 xff0c 如果是灰度 xff0c 那么只需要一个数值来描述它 xff0c 就是单通道 如果有RGB三种颜色来描述它 xff0c 就是三通道 最初输入的图片样本的 channels xf
  • Python中LSTM回归神经网络的时间序列预测

    原文链接 这个问题是国际航空乘客预测问题 xff0c 数据是1949年1月到1960年12月国际航空公司每个月的乘客数量 xff08 单位 xff1a 千人 xff09 xff0c 共有12年144个月的数据 网盘链接 提取码 xff1a
  • pip安装时 fatal error C1083: 无法打开包括文件: “io.h”: No such file or directory

    原文链接 使用pip安装模块 xff0c 出现错误 xff1a c users anaconda3 include pyconfig h 68 fatal error C1083 无法打开包括文件 io h No such file or
  • linux 程序被Killed,查看原因

    原文链接 1 查看信息 xff1a 输入以下程序 xff1a dmesg egrep i B100 39 killed process 39 可以输出最近killed的信息 2 设定kill优先度 xff1a xff08 1 xff09 完
  • Kafka的幂等性与事务性理解

    最近在深入理解Flink的Exactly Once xff0c 发现Flink Checkpoint只能保障Flink程序内部的一致性 xff0c 无法保证Sink到外部系统的Exactly Once语义 但是Sink到外部如果实现了Two
  • 为什么不直接操作State,而是要额外定义一个变量

    最近浏览Flink文章的时候发现一个现象 xff0c 就是在操作State的时候 xff0c 很多文章里面并不会直接操作State xff0c 而是会定义一个相似的变量去操作 xff0c 在 snapshot 和 recover 的时候讲变
  • 了解下SparkSQL中的笛卡尔积

    虽然应该尽量避免使用笛卡尔积 xff0c 因为要全量匹配 xff0c 所以运算的效率十分低下 xff0c 但是有些业务有必须得用 xff0c 所以在此了解下SparkSQL中的笛卡尔积 SparkSQL中计算笛卡尔积时有两种Join方式 x
  • 在Redis集群模式下使用pipeline进行批量操作

    最近开始又接触到了Redis xff0c 之前在工作中使用Redis的时候 xff0c 由于QPS不高 xff0c 都是直接get set搞定了 这次遇到的业务数据量比较大 xff0c 更新也很频繁 xff0c Redis使用是集群模式 x