Redis集群支持事务吗?

5
我是一个redis的新手,只使用了几个月。目前我正在使用2.8.x稳定版本,但是我正在尝试使用3.0.0来导入redis集群功能。我正在使用Java Jedis作为客户端,并且遇到了问题:我发现最新版本的Jedis客户端支持redis集群lua脚本(JedisCluster.evalsha),但是我找不到与管道和事务相关的函数。所以我想知道是Jedis还没有实现(pipeline, transactions)它们,还是redis集群根本不支持管道和事务?
1个回答

4

JedisCluster由于实现难度较大,因此未实现Transaction和Pipeline功能。 在集群模式下,Redis可能会发送MOVED或ASK信息,这意味着我们应该注意节点间的槽移动。

我曾考虑过JedisCluster的Pipeline模式,但目前没有进一步的研究。 https://groups.google.com/d/msg/jedis_redis/u6j8slokO3E/Dh5Q94TRjJUJ

目前,Jedis团队正在专注于稳定/提供更多的API给JedisCluster使用。


嗨,在我们的情况下,我们正在使用大量的事务和管道。因此,如果我们想要使用JedisCluster,我们是否必须将所有那些使用管道或事务的用例重写为lua脚本? - Kim
如果您确定在请求期间不会移动插槽,您可以向Redis集群的任何节点查询“哪个节点拥有插槽”,然后创建Jedis实例,并像普通的Redis和Jedis一样进行请求。 您可以使用JedisClusterCRC16查询关于键->插槽的信息,但目前Jedis不提供外部的插槽->节点查询。 - Jungtaek Lim
请注意,您可以通过JedisClusterInfoCache查询槽口->节点。JedisClusterInfoCache.discoverClusterNodesAndSlots()会发现并映射槽口->节点关系,而JedisClusterInfoCache.getSlotPool()会为您提供连接到持有槽口的节点的JedisPool。 请注意,它不会自动反映节点/槽口更改,因此您可能需要经常调用JedisClusterInfoCache.discoverClusterSlots()。 - Jungtaek Lim
谢谢您的耐心等待。看来,ShardedJedis都不完全支持管道和事务,因此在我们的情况下,我想我们将不得不选择以下两个解决方案:1、使用JedisCluster,并将所有事务和管道重写为lua脚本,在这种情况下,所有redis服务器将承担平等的工作负载;2、使用ShardedJedis,将所有写相关的工作都分配给主redis,并使用ShardedJedis将其他读取工作(包括管道读取)分配给从redis。我是对的吗? - Kim
ShardedJedis不支持Redis Cluster,因此您需要了解ShardedJedis和Redis Cluster之间的差异。如果Redis Cluster适合您,那么1似乎是更好的解决方案。 - Jungtaek Lim
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接