Redisのドキュメントによると、アトミック性に関しては問題ありません:
Redisは、同じLuaインタープリターを使用してすべてのコマンドを実行します。また、Redisは、スクリプトがアトミックな方法で実行されることを保証します。スクリプトの実行中は、他のスクリプトやRedisコマンドは実行されません。このセマンティクスは、MULTI/EXECのセマンティクスに似ています。他のすべてのクライアントの観点からは、スクリプトの効果はまだ表示されていないか、すでに完了しています。
ただし、スクリプトが遅すぎると問題が発生します。したがって、スクリプトは、ある程度のロジックとアトミック性を必要とする軽い操作に最適です。
陥る可能性のあるもう1つの抜け穴は、スクリプトが途中で失敗した場合、スクリプトはエラーを返しますが、行った呼び出しをロールバックできなかったことです。
例:次のようなスクリプトがあります:
redis.call('set', 'foo', 1)
redis.call('rpush', 'foo', 2)
スクリプトの実行はエラーを返しますが、foo
すでに1
としてredisに設定されています 。
あなたの質問とは関係のない何か:あなたが使用していることに気づきました
eval "your_raw_code" key_count keys argv
実際には、ターミナルにいるときにevalでluaスクリプトファイルを呼び出すことができます:
> redis-cli eval "$(cat path/to/script/script_name.lua)" key_count keys argv