Redis Cluster处理MULTI/EXEC事务以及Multiple主键命令时的限制

Redis redis 阅读详情
在上一篇博文中,本博主介绍了Redis Cluster的搭建方法,从中可以看出其使用方法与单机版Redis确实存在着不小的差异。实际上,除了搭建配置方法以外,Redis Cluster还具有一些其他方面的不同,譬如它不支持多个数据库,不支持select命令等等,但其中最大的不同还是Redis Cluster不支持复杂的多主键操作。关于这一点,Redis Cluster的官方文档有这样一段描述,现摘录如下:Commands performing complex multi key operations like Set type unions or intersections are not implemented, and in general all the operations where in theory keys are not available in the same node are not implemented。由这段描述可知,在Redis Cluster中任何跨节点的命令都是不允许的,但是落实到具体的系统实现中,Redis Cluster又是如何去处理这些命令的呢?我们不妨通过两种典型的命令来验证一下,其中一种是MULTI/EXEC事务命令,该命令可以将多条Redis命令一次执行,所以这类命令可能同时操作多个主键,另外一种是本身就支持多主键的命令如mset和mget等。下面,本博主就在之前搭建的Redis Cluster上,分别尝试了以上两类命令的不同执行场景,以此来感性地认识Redis Cluster的反应!

情景一:MULTI/EXEC事务中的所有命令均操作相同的主键,且该主键就在当前连接的Redis节点上
  1. [root@compute-09-00 ~]# /usr/local/redis/bin/redis-cli
  2. redis 127.0.0.1:6379> multi
  3. OK
  4. redis 127.0.0.1:6379> set hello world
  5. QUEUED
  6. redis 127.0.0.1:6379> set hello earth
  7. QUEUED
  8. redis 127.0.0.1:6379> set hello china
  9. QUEUED
  10. redis 127.0.0.1:6379> exec
  11. 1) OK
  12. 2) OK
  13. 3) OK
复制代码


执行结果:事务中的每条命令都可以正确执行!

情景二:MULTI/EXEC事务中的所有命令均操作相同的主键,但该主键不在当前连接的Redis节点上
  1. redis 127.0.0.1:6379> multi
  2. OK
  3. redis 127.0.0.1:6379> get foo
  4. (error) MOVED 12182 192.168.32.4:6379
  5. redis 127.0.0.1:6379> set foo bar
  6. (error) MOVED 12182 192.168.32.4:6379
  7. redis 127.0.0.1:6379> exec
  8. (empty list or set)
复制代码


执行结果:事务中的任何命令都无法执行,对于每条命令均返回MOVED信息!


情景三:MULTI/EXEC事务中的所有命令操作不同的主键,且某些主键不在当前连接的Redis节点上
  1. redis 127.0.0.1:6379> multi
  2. OK
  3. redis 127.0.0.1:6379> set hello america
  4. QUEUED
  5. redis 127.0.0.1:6379> set foo rab
  6. (error) MOVED 12182 192.168.32.4:6379
  7. redis 127.0.0.1:6379> exec
  8. 1) OK
  9. redis 127.0.0.1:6379> get hello
  10. "america"
复制代码


执行结果:主键在当前连接的Redis节点上的命令可以正确执行,主键不在当前连接的Redis节点上的命令返回MOVED信息!

情景四:MULTI/EXEC事务中的所有命令操作不同的主键,且所有主键均在当前连接的Redis节点上
  1. redis 192.168.32.3:6379> multi
  2. OK
  3. redis 192.168.32.3:6379> set id 10003
  4. QUEUED
  5. redis 192.168.32.3:6379> set number 20004
  6. QUEUED
  7. redis 192.168.32.3:6379> set student 30098
  8. QUEUED
  9. redis 192.168.32.3:6379> exec
  10. 1) OK
  11. 2) OK
  12. 3) OK
复制代码


执行结果:事务中的所有命令均可以成功执行!

情景五:Multiple主键命令包含了不同的主键,且所有主键均在当前连接的Redis节点上
redis 192.168.32.3:6379> mset id 10004 number 20005 student 30099
(error) ERR Multi keys request invalid in cluster
redis 192.168.32.3:6379> mget id number student
(error) ERR Multi keys request invalid in cluster
执行结果:命令无效,无法执行!

情景六:Multiple主键命令包含了多个相同的主键,且该主键在当前连接的Redis节点上
  1. redis 192.168.32.3:6379> mset id 10004 id 20005 id 30099
  2. OK
  3. redis 192.168.32.3:6379> mget id id id
  4. 1) "30099"
  5. 2) "30099"
  6. 3) "30099"
复制代码


执行结果:命令有效,成功执行!


情景七:Multiple主键命令包含了多个相同的主键,但该主键不在当前连接的Redis节点上
  1. redis 192.168.32.3:6379> mset hello world hello earth hello universe
  2. (error) MOVED 866 192.168.32.2:6379
  3. redis 192.168.32.3:6379> mget hello hello hello
  4. (error) MOVED 866 192.168.32.2:6379
复制代码


执行结果:命令有效,返回MOVED信息!


   基于以上执行结果,我们可以知道对于MULTI/EXEC事务来说,执行效果与逐条处理单个命令一样,被事务包裹的Redis命令连接节点能够处理就处理,无法处理的就返回MOVED信息。但是对于Multiple主键的命令来说,只要在命令中包含了多个不同的主键,那么无论这些主键能不能被连接节点所处理,命令都是无效的!当然,以上只是通过一些具体的命令执行实例来看Redis Cluster的执行效果,如果想对Redis Cluster的命令处理有更详细的了解,那么推荐的方法还是去看源码中的cluster.c文件。
【信息科学与工程学】计算机科学与自动化——第三百零四篇 高性能系统开发指南01 高并发:限流、熔断、降级高性能:红包拆分、多级缓存、大Key/热Key拆分、Pipeline、线程池、RocketMQ零丢失、幂等、分布式锁、集群缩容、分批入库海量数据处理:日志分表分片、跨表查询、冷热分层、大数据引擎服务器选型系统安全:网关安全、服务器安全、云存储安全、风控、监控、测试数据一致性:缓存与数据库一致性、大厂方案、蓝绿回滚、流量一致性、流程一致性项目与团队管理:流程问题、管理问题(风险、成本、人员、文档、培训)稳定性建设:上线三板斧、线上五步闭环、混沌工程、容量规划。 阅读详情

相关推荐

使用bandersnatch搭建pypi 本地镜像源(20211026)

需求背景:公司内网不能联网,同时开发工作需要各种python的模块,因此需要搭建一个pypi的本地镜像源。 参考网上的方法,总结了大致有下面几种方式搭建pypi本地源: devpi: 企业内网利用devpi搭建pypi私服 - 简书 pip2pi: https://yangfannie.com/1439.html pypiserver: https://zhongneng.github.io/2019/02/16/creat-pip/ bandersnatch:基于bandersnatch搭...

liurizhou的博客 6468

Jedis cluster命令执行流程剖析

面试:你懂什么是分布式系统吗?Redis分布式锁都不会?>>> ...

Viking的博客 1653

Windsurf 入门指南:从安装到实战(免费AI IDE新选择)

本文是Windsurf AI IDE的详细入门指南,涵盖从下载安装到核心功能实战的全过程。通过对比分析,文章指出Windsurf凭借其免费、小白友好的特性及强大的上下文感知能力,成为学习编程和提升开发效率的新选择,特别适合零基础开发者和寻求高效AI编程工具的开发者。

weixin_29237635的博客 855

Redis Cluster 原理说的头头是道,这些配置不懂就是纸上谈兵

Redis Cluster 集群相关配置,使用集群方式的你必须重视和知晓。别嘴上原理说的头头是道,而集群有哪些配置?如何配置让集群快到飞起,实现真正的高可用却一头雾水,通过下面这些配置详解也让你对集群原理更加深刻,告别技术悬浮。关于 Redis Cluster原理请点击《Redis 高可用篇:Cluster 集群能支撑的数据有多大?》cluster-enabled普通的 Redis 实例是不能成...

码哥字节 836

富士SC2022,C325,C328打印机扫描到网络详细教程

富士打印机SC2022,C328,C325等型号扫描到电脑教程

weixin_41926602的博客 1万+

使用 git一个仓库管理多个项目

我们需要在 git 里面创建一个空分支,该分支不继承任何提交,没有父节点,完全是一个干净的分支,这时候就需要使用 orphan。该命令会创建一个新的分支,并且该分支有前一个分支下的所有文件,我们不想提交任何内容,所以我们需要把当前内容全部删除。此时 master 分支已经有一个项目了,下面我们创建新的分支管理另一个项目。此时可以在该分支目录上初始化你的项目,在执行 git 命令提交代码。此时我们就完成了在同一个仓库管理不同项目的需求了。下载仓库到本地之后,进入项目目录,查看分支信息。

xrs151的博客 2028

Redis进阶学习10---redis最佳实践

Redis进阶学习10---redis最佳实践Redis最佳实践优雅的key结构BigKey问题BigKey的危害如何发现BigKeys如何删除bigKeys恰当的数据类型小总结 Redis最佳实践 优雅的key结构 Redis的Key虽然可以自定义,但最好遵循下面的几个最佳实践约定: 遵循基本格式:[业务名称]:[数据名]:[id] 长度不超过44字节 不包含特殊字符 例如:我们的登录业务,保存用户信息,其key是这样的: 优点: 可读性强 避免key冲突 方便管理 更节省内存:

m0_53157173的博客 1526

VTK在QT与非QT环境下使用的区别

VTK可以在QT框架内使用,也可以独立于QT使用,这两种使用方式在架构、交互和渲染方面有显著差异。

深之JohnChen的专栏 629

RedisCluster如何高效率地批量插入数据

RedisCluster如何高效率地批量插入数据

Funky_oaNiu的博客 2762

⭐️【2024年新版教程】vmware tools安装步骤(Windows、Linux、MacOS版本)

VMware Tools是VMware提供的一套实用工具,它可以增强虚拟机与宿主机之间的交互性能,如改进显示性能、优化鼠标和键盘性能、提供时间同步功能等。无论是在Windows、Linux还是MacOS虚拟机上,安装VMware Tools都可以提高虚拟机的使用体验。以上就是在不同操作系统上安装VMware Tools的步骤,希望对您有所帮助。

Python老吕的博客 6万+

20、Citrix 云桌面常见VDA注册问题汇总

本文总结了与 VDA 中出现的 VDA 会话断开连接、注册、会话卡住以及挂起/崩溃相关的主要支持文章。

我在Citrix、VMware、Veeam、微软和NVIDIA等领域拥有丰富经验的专业人士,专注于设计和维护虚拟化基础设施、实施备份与灾难恢复策略,致力于优化企业的IT环境。 944

multi redis 不能使用集群_Redis Cluster处理MULTI/EXEC事务以及Multiple主键命令时的限制...

[root@compute-09-00 ~]# /usr/local/redis/bin/redis-cliredis 127.0.0.1:6379> multiOKredis 127.0.0.1:6379> set hello worldQUEUEDredis 127.0.0.1:6379> set hello earthQUEUEDredis 127.0.0.1:6379&g...

weixin_39924198的博客 424

SAP 系统升级不再惧怕 SPAU 与 SPDD:把修改调整做成可控的工程

SAP系统升级中的SPAU/SPDD处理要点:首先明确SPDD处理数据字典对象,SPAU处理程序对象,核心是解决标准对象变更与历史修改的继承问题。关键原则是优先回归标准版本,减少后续升级负担。操作时应利用版本管理对比差异,批量处理可回退对象,并通过F9多选提高效率。对于提示"当前版本与建议一致"的对象直接回归标准。注意区分新旧SPAU界面功能差异,将Note下载移至SNOTE处理,并确保在SPDD/SPAU之后处理SPAU_ENH。最后,所有调整需记录日志并纳入传输请求,确保可追溯性。遵

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 390

ZooKeeper的典型应用

Zookeeper是一个高可用的分布式数据管理与协调框架。基于对ZAB算法的实现,该框架能够很好地保证分布式环境中数据的一致性。 随着近年来互联网系统规模的不断扩大,大数据时代飞速到来,越来越多的分布式系统将Zookeeper作为核心组件使用,如Hadoop、HBase和Kafka等。 1.数据发布/订阅 数据发布/订阅(Publish/Subscribe)系统,即所谓的配置中心,顾名思义就是发布者将数据发布到ZooKeeper的一个或一系列节点上,供订阅者进行数据订阅,从而达到动态获取数据的目的,实

yfy的博客 673

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JedisCluster源码解析

JedisCluster源码解析

Isonion的博客 493

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Redis Lettuce在Cluster模式下使用(自定义事务)

在redis cluster模式下,基于某些redis业务为了保证redis command的原子性又要提高程序的高并发性能,从而直接使用redis事务可能会更好的满足的我们的要求,但是直接使用redis cluster的连接是不支持事务的,也就是multi模式,单是4.0以上的lettuce官网说是支持multi模式的,经过多次实践研究终于得出了一种可以在redis cluster模式下使用multi的方案。直接连接cluster不可以那么我们直接连接到单台的redis。

Timmer的博客 2868

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Redis集群--使用/注意事项

本文介绍使用Redis集群时需要注意的问题。

IT利刃出鞘的博客 7826

redis之---redis集群方案

本篇文章主要写redis的集群方案相关知识,欢迎大家多多斧正,如果觉得小墨我写得用心的话,可以点个赞啊。 redis提供原生的高可用方案有: 1,主从复制 2,哨兵机制 3,cluster 我们比较下: - 复制:复制主要实现了数据的多机备份以及对于读操作的负载均衡和简单的故障恢复。缺陷是故障恢复无法自动化、写操作无法负载均衡、存储能力受到单机的限制。 - 哨兵:在复制的基础上,哨兵实现了 自动化 的 故障恢复。缺陷是 写操作 无法 负载均衡,存储能力 受到 单机 的限制。 - 集群:通过集群,

as4566的博客 577

#### Redis Cluster 限制及解决方案 ####

转自:https://www.cnblogs.com/lovezbs/p/13885569.html 仅供个人备份,浏览请务必查看原文 1. 概述 Redis Cluster 是 Redis 原生的数据分片实现,可以自动在多个节点上分布数据,不需要依赖任何外部的工具。 Redis Cluster 中所有 key 会被分派到16384个slot(hash 槽)中,这些 slot 又会被指派到多个 Redis 节点上。 一个 key 会映射到某个 slot,算法: HASH_...

仅做个人笔记 3874

Redis集群(Cluster)

三种数据分片算法,搭建redis集群,redis集群扩容

weixin_61427900的博客 3852

数据结构--知识点16--搜索算法(二叉树)

文章目录一、树的概念1、特点2、树的术语3、树的种类4、树的存储与表示5、常见的树的应用场景二、二叉树1、概念2、性质 一、树的概念 树是一种抽象数据类型(ADT)或是视作这种抽象数据类型的数据结构 1、特点 每个节点有零个或多个子节点 没有父节点的节点称为根节点 每一个非根节点有且只有一个父节点 除了根节点外,每个子节点可以分为**多个不相交(因为都只有一个父节点)**的子树 2、树的术语 节点的度:一个节点含有的子树的个数称为该节点的度 树的度:一棵树中,最大的节点的度称为树的度 叶节点或终端节点

ANingL的博客 3543

redis中的multi和pipeline

事务块 multi redis中的 multi 方法,提供了一个队列用于缓存多个指令,...

aben_sky的专栏 1869

JedisCluster模式尝试进行批量操作

搭建完redis集群后,可以通过jedis的JedisCluster来访问Redis集群,这里列出使用jedisCluster的spring bean配置方式: <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxI...

weixin_30521649的博客 657

Redis之——Jedis、jedisCluster的使用

1、Jedis客户端 https://redis.io/clients 2、Jedis源码包与使用介绍 https://github.com/xetorthio/jedis 3、项目中使用 通过maven引入Jedis的依赖包 <dependency> <groupId>redis.clients</groupId> <art...

冰河的专栏 9035
上一篇: 解决IntelliJ IDEA中文输入法下,输入提示框不跟随问题
下一篇: Spring 源码阅读 BeanFactory(三) 对象的初始化 singleton 草稿
weiythi
博客等级 码龄16年 23粉丝 48原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值