8

複数のノードで構成される 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 と互換性があるはずです。ここで何が問題なのか、単一のスクリプトですべてのキーを更新するにはどうすればよいのでしょうか。

4

1 に答える 1