当前位置: 首页 > 面试题库 >

是否有任何Redis客户端(首选Java)支持Redis集群上的事务?

夏嘉德
2023-03-14
问题内容

我集中精力查看在线,但是找不到提供此功能的成熟Redis客户端。只发现了这个项目。任何人都知道Redis客户提供上述内容吗?谢谢。


问题答案:

Redis集群中的事务与Redis Standalone的事务不同。

与客户问题相比,这更多是关于担保和权衡的概念性问题。

说明

在Redis群集中,特定节点是一个或多个哈希槽的主节点,这是在多个节点之间分片数据的分区方案。根据命令中使用的键计算得出的一个哈希槽位于一个节点上。具有多个键的命令被限制为产生相同的哈希槽。否则,它们将被拒绝。这样的星座称为交叉时隙。

事务似乎是执行命令来交叉插入密钥的解决方案,但是在某个时候,一个事务将离开一个节点的范围,并且需要另一个节点来继续事务。如果一个密钥位于一个节点上,而另一个密钥位于另一个节点上,则可能是这种情况。仍然没有事务协调,有时可能是Redis
Cluster问题的问题。

为Redis Cluster提供事务支持的高级API面临多个问题,到目前为止,有两种策略,即如何在Redis Cluster中处理事务:

如果所有密钥都位于一个节点上,则支持交易

此选项允许功能齐全的事务。要求客户端库跟踪事务执行的节点,并在事务进行期间禁止插槽范围之外的键。因为只能通过使用包含密钥的命令来确定插槽,所以客户端需要设置事务标记,并且在包含密钥的第一个命令上,就需要在事务中的第一个命令之前发出MULTI命令。显然,这里的限制是要求所有密钥都位于一个节点上。

分布式交易

在这种情况下,将在加入分布式事务的所有节点上启动多个事务。该分布式事务可以包括来自所有主节点的密钥。一旦执行了事务,客户端库就会触发事务的执行,该库会收集所有结果(以保持命令结果的顺序)并将其返回给调用方。

这种交易方式对客户透明。一旦请求了特定节点上的密钥,并且该节点尚未成为事务的一部分,MULTI就会发出命令将该节点加入事务。这里的缺点是交易不再是有条件的(WATCH)。单个事务不知道密钥是否已在其他节点上更改,因此一个事务可以回滚,而其他事务将成功。听起来有点像两阶段提交。

结论

Redis Transactions感觉就像可以有条件地进行原子命令批处理。重要的是要记住命令执行被延迟,因为读取结果在事务执行时而不是在命令发出时返回。

对于Redis
Cluster,客户尚未决定采用全球战略。在特定的Redis群集节点上运行事务是安全的,但仅限于该节点提供的密钥。两种可能的策略都具有对于某些用例有用的属性,但也有局限性。



 类似资料:
  • 我是redis的新手,我刚刚使用redis几个月了。目前我使用的是2.8.x稳定版本,但我试图使用3.0.0来导入redis集群功能。我使用java jedis作为客户机,这是我的问题:我发现jedis client的最新版本支持redis cluster lua脚本(jediscluster.evalsha),但我在哪里都找不到管道和事务相关的函数,所以我想知道是jedis还没有实现它(管道、事

  • 本文向大家介绍Redis 支持的 Java 客户端都有哪些?相关面试题,主要包含被问及Redis 支持的 Java 客户端都有哪些?时的应答技巧和注意事项,需要的朋友参考一下 支持的 Java 客户端有 Redisson、jedis、lettuce 等。

  • 我已经成功地在一个redis实例中使用multi和exec功能在redis中实现了(并测试了)事务操作。但是,在集群安装程序中运行的相同代码出错,出现以下异常消息。我使用spring-data-redis-1.8.1.release和jedis-2.9.0。 当前在集群模式下的spring data redis中是否支持事务(multi、exec)?如果是的话,我错过了什么?如果没有,是否有任何解

  • 请问 amh能否支持redis-stack

  • 我已经使用jedis将redis集成到我的spring web应用程序中(redis支持AWS弹性缓存)。在单节点上,它可以很好地使用单绝地连接工厂进行读写。 我现在需要将它扩展到一个集群,以便写入主节点并从次节点读取。也就是说,如果一个下降,那么复制将由AWS自动发生,在这种情况下,我将连接的主机名将被更改。 如何读取进入图片的新节点? 我如何从spring容器(我指的是XML文件)连接到它?

  • 我有一个项目连接到独立的redis,客户端创建为: 用于绝地武士和spring data redis的库版本为: 现在我需要移动到集群redis,并将客户端创建更改为 通过此代码更改,我在群集中找不到可访问的节点,如下所示: } 由于spark-2.1.3中运行了spark应用程序,由于版本依赖性,我需要使用相同的spring data redis。如果没有jedis和spring data re