[英]Spring Data Redis - watch and multi on same cluster node
我的目标是将事务逻辑(watch+multi)应用于 redis 集群。 我可以在此处、 此处和spring-data-redis存储库中看到 spring 数据 redis 不支持集群上的事务。 不过,考虑到我需要在同一个节点上执行此操作,我尝试执行以下操作:
val keySerialized = "myKey".toByteArray()
val valueSerialized = "myValue".toByteArray()
val node = redisTemplate.connectionFactory.clusterConnection.clusterGetNodeForKey(keySerialized)
val clusterExecutor = (redisTemplate.connectionFactory.clusterConnection as LettuceClusterConnection).clusterCommandExecutor
clusterExecutor.executeCommandOnSingleNode(
(ClusterCommandExecutor.ClusterCommandCallback { client: RedisCommands<ByteArray, ByteArray> -> client.watch(keySerialized) })
,node)
clusterExecutor.executeCommandOnSingleNode(
(ClusterCommandExecutor.ClusterCommandCallback { client: RedisCommands<ByteArray, ByteArray> -> client.multi() })
,node)
clusterExecutor.executeCommandOnSingleNode(
(ClusterCommandExecutor.ClusterCommandCallback { client: RedisCommands<ByteArray, ByteArray> -> client.get(keySerialized) })
,node)
clusterExecutor.executeCommandOnSingleNode(
(ClusterCommandExecutor.ClusterCommandCallback { client: RedisCommands<ByteArray, ByteArray> -> client.set(keySerialized, valueSerialized) })
,node)
clusterExecutor.executeCommandOnSingleNode(
(ClusterCommandExecutor.ClusterCommandCallback { client: RedisCommands<ByteArray, ByteArray> -> client.exec() })
,node)
当我只运行一个代码实例时,这很好用。 示例:如果我在调试代码时在 redis 控制台中执行 SET,则事务将按预期失败。
但是,如果我在两个线程中运行此代码,则会发生两者都使用相同的连接。 当第二个线程运行 MULTI 命令时,出现以下错误
Caused by: io.lettuce.core.RedisCommandExecutionException: ERR MULTI calls can not be nested
我相信通过强制执行者使用新的连接可能是一个解决方案,但我不知道该怎么做。 对此有什么想法吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.