1

説明するシナリオの例を次に示します。

いくつかのキー=>値のペアがあるとします:

hmset thing1 name 'a thing' color red
hmset thing2 name 'another thing' color green
hmset thing3 name 'also a thing' color blue

そして、値がキー名であるリスト:

lpush things thing1
lpush things thing2
lpush things thing3

私の目標は、間接参照を使用してさまざまなものから値を取得することです。

thingsArray = lrange things 0 2
for each thing in thingsArray
  result.push(hmget thing name color)

しかし、これに対するペナルティは余分な往復です。これはパイプライン処理である程度軽減できることはわかっていますが、Lua スクリプトを使用した 1 回の往復で可能になることを期待していました。次のようなものです:

eval superAwesomeScript 1 things 0 2

問題は、Lua スクリプトを呼び出しているときに、"things" リストの lrange 呼び出しによってどのキーが返されるかわからないことです。Lua スクリプトでこのようにデータにアクセスすることは、Redis クラスターの将来を保証するために提案されたルールに違反しますか?

私は Redis にはかなり慣れていませんが、Lua にはまったく慣れていないので、私の目標から外れている場合は、そのことを教えてください。また、複数のラウンドトリップに関する私の主な懸念は、特に水平にスケーリングされたクラスター内でのネットワーク io です。したがって、まったく異なるソリューションも歓迎されます。

4

1 に答える 1

2

EVALドキュメントから:

適切な方法でキーを渡す理由は、EVAL の前にすべての Redis コマンドを実行前に分析して、コマンドが操作するキーを確立できるためです。

これが EVAL に当てはまるためには、キーも明示的でなければなりません。これは多くの点で便利ですが、特に、Redis クラスターがリクエストを適切なクラスター ノードに確実に転送できるようにするためです (Redis クラスターは進行中の作業ですが、スクリプト機能はそれをうまく処理するために設計されました)。 . ただし、Redis クラスターと互換性のないスクリプトを作成することを犠牲にして、Redis の単一インスタンス構成を悪用する機会をユーザーに提供するために、このルールは強制されません。

于 2013-05-17T04:06:31.477 に答える