翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Lua スクリプト
Valkey と Redis は、Lua スクリプトを実行するコマンドを含め、200 を超えるコマンドOSSをサポートしています。ただし、Lua スクリプトについては、Valkey または Redis のメモリと可用性に影響を与える可能性のあるいくつかの落とし穴がありますOSS。
パラメータ化されていない Lua スクリプト
各 Lua スクリプトは、実行前に Valkey または Redis OSSサーバーにキャッシュされます。パラメータ化されていない Lua スクリプトは一意であるため、Valkey または Redis OSSサーバーが多数の Lua スクリプトを保存し、より多くのメモリを消費する可能性があります。これを軽減するには、すべての Lua スクリプトがパラメータ化され、必要に応じて定期的に実行SCRIPTFLUSHしてキャッシュされた Lua スクリプトをクリーンアップします。
次のコード例では、パラメータ化したスクリプトの使い方を紹介します。まず、パラメータ化しない場合の例を紹介します。この場合、3 つの異なる Lua スクリプトがキャッシュされるため、推奨されません。
eval "return redis.call('set','key1','1')" 0 eval "return redis.call('set','key2','2')" 0 eval "return redis.call('set','key3','3')" 0
代わりに、以下のパターンを使用して、渡されたパラメータを受け入れることができる単一のスクリプトを作成してください。
eval "return redis.call('set',KEYS[1],ARGV[1])" 1 key1 1 eval "return redis.call('set',KEYS[1],ARGV[1])" 1 key2 2 eval "return redis.call('set',KEYS[1],ARGV[1])" 1 key3 3
実行時間の長い Lua スクリプト
Lua スクリプトは複数のコマンドをアトミックに実行できるため、通常の Valkey コマンドや Redis OSS コマンドよりも完了までに時間がかかる場合があります。Lua スクリプトが読み取り専用のオペレーションのみを実行する場合は、途中で停止できます。ただし、Lua スクリプトが書き込みオペレーションを実行した時点で強制終了できなくなり、最後まで実行しなければなりません。長時間実行されている Lua スクリプトをミューテーションすると、Valkey または Redis OSSサーバーが長時間応答しなくなる可能性があります。この問題を軽減するには、実行時間の長い Lua スクリプトを避け、実稼働前の環境でスクリプトをテストしてください。
ステルス書き込みを行う Lua スクリプト
Lua スクリプトは、Valkey または Redis OSSが を超えているOSS場合でも、Valkey または Redis に新しいデータを書き込む方法をいくつか示しますmaxmemory
。
スクリプトは、Valkey または Redis OSSサーバーが を下回ったときに開始され
maxmemory
、 内に複数の書き込みオペレーションが含まれます。スクリプトの最初の書き込みコマンドはメモリを消費せず ( などDEL)、その後にメモリを消費する書き込みオペレーションが増えます。
この問題は、 以外の Valkey または Redis OSSサーバーで適切な立ち退きポリシーを設定することで軽減できます
noeviction
。これにより、Redis OSSはアイテムを削除し、Lua スクリプト間でメモリを解放できます。