RedisにはTransaction機能とCluster機能の両方が実装されています
ここらへんの機能を同時に動くかのかどうかがよく分からなかったので調べてみました
検証は下記のdocker-composeのプロジェクトを使用して行いました
https://github.com/cpapidas/docker-compose-redis-cluster
port=7000,7001,7002でクラスタリングされているredis-clientから2つのクライアントを使ってアクセスします
without transaction
cli.1 $ set foo bar
OK
cli.2 $ get foo
"bar"
cli.2 $ set foo bal
OK
cli.1 $ get foo
"bal"
普通に順番にアクセスするだけですね
use multi using same key
cli.1 $ multi
OK
cli.1 $ set foo bar
QUEUED
cli.1 $ get foo
QUEUED
cli.2 $ multi
OK
cli.2 $ get foo
QUEUED
cli.2 $ set foo bag
QUEUED
cli.2 $ get foo
QUEUED
cli.2 $ exec
1) "bal"
2) OK
3) "bag"
OK
cli.1 $ exec
1) OK
2) "bar"
同じキーにアクセスする限り、他ノードへのリダイレクトは発生しません
そのため、execを実行したタイミングでキューイングされたコマンドが実行されます
use multi using different key
cli.1 $ multi
OK
cli.1 $ set foo bal
QUEUED
cli.1 $ set fooo bal
-> Redirected to slot [3916] located at 173.17.0.2:7000
OK
cli.1 $ exec
(error) ERR EXEC without MULTI
cli.1 $ get foo
"bar"
cli.1 $ get fooo
"bal"
multi中にリダイレクトが発生するコマンドが発生すると、キューが溜まっていても
破棄されて、リダイレクトが発生したコマンドが単発で実行されるようです
以上からキーの対象ノード下しかTransactionを使えないことが分かりました。
ClusterとTransaction使用をうまいこと使おうとした場合、アプリケーション層で
がんばらないといけなさそうです。
ライブラリが超頑張ってくれればなんとかなりそうな気もしますが、パッと探してみた感じ出来なさそうです(JVM系で知ってたら誰か教えて)