【问题标题】:does redis cluster support transactions ?redis集群支持事务吗?
【发布时间】:2015-08-26 14:04:19
【问题描述】:

我是 redis 的新手,我刚刚使用 redis 几个月。目前我正在使用 2.8.x 稳定版本,但我正在尝试使用 3.0.0 来导入 redis 集群功能。我正在使用java jedis作为客户端,这是我的问题:我发现最新版本的Jedis客户端支持redis集群lua脚本(JedisCluster.evalsha),但是我找不到管道和事务相关的功能,所以我想知道如果是 Jedis 还没有实现它(管道,事务)还是只是 redis 集群根本不支持管道和事务?

【问题讨论】:

    标签: lua redis cluster-computing jedis


    【解决方案1】:

    JedisCluster 没有实现 Transaction 和 Pipeline,因为它很难实现。 Redis 在集群模式下可以发送 MOVED 或 ASK,这意味着我们应该注意在节点之间移动 slot。

    我正在考虑 JedisCluster 的流水线模式,但没有进行进一步的研究。 https://groups.google.com/d/msg/jedis_redis/u6j8slokO3E/Dh5Q94TRjJUJ

    目前 Jedis 团队正致力于稳定/为 JedisCluster 提供更多 API。

    【讨论】:

    • 嗨,在我们的例子中,我们使用了大量的事务和管道。那么如果我们想使用 JedisCluster,我们是否必须将所有那些流水线或事务处理的用例重写​​为 lua 脚本?
    • 不幸的是,是的。使用“Redis Cluster”一次安全地发送两个或多个操作的唯一方法是使用 multi-exec 进行批处理。但由于 Jedis 没有考虑批量请求,因此需要执行大量工作。
    • 如果你确定请求的时候没有移动slot,可以向Redis Cluster的任意一个节点查询“what node is having slot”,并创建Jedis实例,像普通Redis一样请求&绝地武士。可以使用 JedisClusterCRC16 查询 key -> slot,但目前 Jedis 不对外提供 slot -> node 查询。
    • 编辑:您可以通过 JedisClusterInfoCache 查询 slot -> 节点。 JedisClusterInfoCache.discoverClusterNodesAndSlots() 发现并映射槽 -> 节点关系,JedisClusterInfoCache.getSlotPool() 为您提供连接到节点持有槽的 JedisPool。请注意,它不会自动反映节点/槽的变化,因此您可能需要经常调用 JedisClusterInfoCache.discoverClusterSlots()。
    • 感谢您的耐心等待。 ShardedJedis 似乎也不完美地支持管道和事务,所以在我们的情况下,我想我们将不得不选择以下两种解决方案: 1,使用 JedisCluster 并将所有事务和管道重写为 lua 脚本,在这种情况下,所有 redis 服务器将相等工作量; 2、使用ShardedJedis,把所有写相关的工作都做到master-redis,其他的读工作(包括流水线读)用ShardedJedis到slave-redis。我说的对吗?
    猜你喜欢
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2020-04-06
    • 1970-01-01
    • 2019-01-01
    • 2015-06-18
    • 2022-11-30
    相关资源
    最近更新 更多