複数のノードで構成される Redis クラスターがあります。1 回のアトミック操作で 3 つの異なるキーを更新したいと考えています。私のLuaスクリプトは次のようなものです:
local u1 = redis.call('incrby', KEYS[1], ARGV[1])
local u2 = redis.call('incrby', KEYS[2], ARGV[1])
local u3 = redis.call('incrby', KEYS[3], ARGV[1])
そして、私はそれを発射しました:
EVAL script 3 key1 key2 key3 arg
しかし、エラーメッセージが表示されました:
WARN Resp(AppErr CROSSSLOT Keys in request don't hash to the same slot)
上記の操作は実行できず、更新は失敗します。単一の Lua スクリプトで異なるノードのキーを変更できないようです。しかし、ドキュメントによると:
すべての Redis コマンドは、実行前に分析して、コマンドが操作するキーを決定する必要があります。これを EVAL に適用するには、キーを明示的に渡す必要があります。これは多くの点で便利ですが、特に Redis クラスターがリクエストを適切なクラスター ノードに転送できるようにするために役立ちます。
このルールは、Redis クラスターと互換性のないスクリプトを作成することを犠牲にして、Redis の単一インスタンス構成を悪用する機会をユーザーに提供するために強制されないことに注意してください。
したがって、キーの受け渡し規則に従っていれば、スクリプトは Redis Cluster と互換性があるはずです。ここで何が問題なのか、単一のスクリプトですべてのキーを更新するにはどうすればよいのでしょうか。