8

I like the Lua-scripting for redis but i have a big problem with TIME.

I store events in a SortedSet.

The score is the time, so that in my application i can view all events in given time-window.

redis.call('zadd', myEventsSet, TIME, EventID);

Ok, but this is not working - i can not access the TIME (Servertime).

Is there any way to get a time from the Server without passing it as an argument to my lua-script? Or is passing the time as argument the best way to do it?

4

1 に答える 1

13

これは明示的に禁止されています (私が覚えている限り)。この背後にある理由は、lua 関数は決定論的であり、引数のみに依存する必要があるためです。この Lua 呼び出しが別のシステム時刻を持つスレーブに複製されたらどうなるでしょうか?

編集 (Linus G Thiel 著):これは正しいです。redis EVAL docsから:

純粋関数としてのスクリプト

スクリプト作成の非常に重要な部分は、純粋な関数であるスクリプトを作成することです。Redis インスタンスで実行されるスクリプトは、結果のコマンドではなく、スクリプトを送信することによってスレーブに複製されます。

[...]

スクリプトでこの動作を強制するために、Redis は次のことを行います。

  • Lua は、システム時刻やその他の外部状態にアクセスするためのコマンドをエクスポートしません。
  • RANDOMKEY、SRANDMEMBER、TIME などの Redis ランダム コマンドの後に、スクリプトがデータ セットを変更できる Redis コマンドを呼び出すと、Redis はエラーでスクリプトをブロックします。これは、スクリプトが読み取り専用で、データ セットを変更しない場合、これらのコマンドを自由に呼び出すことができることを意味します。ランダム コマンドは、必ずしも乱数を使用するコマンドを意味するわけではないことに注意してください。非決定論的なコマンドはすべてランダム コマンドと見なされます (この点での最良の例は TIME コマンドです)。

その理由、さまざまなシナリオでこれに対処する方法、およびスクリプトで使用できる Lua ライブラリについては、豊富な情報があります。ドキュメント全体を読むことをお勧めします。

于 2012-09-03T09:07:49.460 に答える