アトミック操作とトランザクション
Luaスクリプトで複数段階のRedis操作をアトミックに実行します。
「アトミック操作とトランザクション」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
なぜアトミックな複数ステップ操作が必要なのですか
多くのRedisのユースケースでは、複数のキーの読み取りと書き込みを、一貫性のある単一の操作で行う必要があります。アトミック性がなければ、競合状態によって状態が破損します。
読み取り・変更・書き込みの競合状態
Luaを使わない場合:GET counter → クライアントで変更 → SET counter。2つのクライアントが同じ値を読み取り、両方が変更すると、2回目のSETが1回目の変更を上書きする可能性があります。
Luaスクリプトによる解決
RedisでLuaを使うと、読み取り・変更・書き込みをサーバー内部でアトミックに実行できます。
EVAL "
local val = redis.call('GET', KEYS[1])
val = tonumber(val) or 0
val = val + tonumber(ARGV[1])
redis.call('SET', KEYS[1], val)
return val
" 1 counter 5比較と交換
CAS(compare-and-swap)をアトミックに実装します — 現在の値が期待値と等しい場合にのみ更新します。
EVAL "
local cur = redis.call('GET', KEYS[1])
if cur == ARGV[1] then
redis.call('SET', KEYS[1], ARGV[2])
return 1
end
return 0
" 1 mykey expected newvalue分散ロック
ロックをアトミックに取得します:SET key value NX EX seconds。これは安全なパターンであり、Luaで実現する場合も同じです。
EVAL "
if redis.call('SET', KEYS[1], ARGV[1], 'NX', 'EX', ARGV[2]) then
return 1
end
return 0
" 1 lock:resource "owner-uuid" 30ロックを安全に解放する
ロックを解放するのは、自分が所有者である場合だけにします。これにより、別のクライアントが他のクライアントのロックを解放するのを防げます。
EVAL "
if redis.call('GET', KEYS[1]) == ARGV[1] then
return redis.call('DEL', KEYS[1])
end
return 0
" 1 lock:resource "owner-uuid"複数キーのトランザクション
Luaスクリプトでは、複数のキーをアトミックに操作できます。これはMULTI/EXECでは保証できません(途中で失敗して部分的な状態が残る可能性があります)。
MULTI/EXECとLuaの比較
MULTI/EXECはコマンドをキューに入れて一括実行しますが、読み取り値に関して真のアトミック性はありません(WATCH/UNWATCHを使うと複雑になります)。Luaスクリプトのほうが単純で、完全にアトミックです。
Luaでのロールバック
Redis Luaはロールバックを伴うトランザクションをサポートしていません。途中でエラーが発生しても、すでに実行されたredis.callコマンドは取り消されません。事前条件を先に確認することで、スクリプトを安全に設計します。
スクリプトサイズの制限
スクリプトは小さく、高速に保つ必要があります。複雑なロジックはRedisではなく、アプリケーション層に配置します。Luaはアトミックにする部分だけに使用します。
アトミック性のテスト
同時実行するRedisクライアントを使って競合状態をテストします。Redisのベンチマークツールを使用し、高い同時実行性のもとでLuaスクリプトが正しい状態を維持することを確認します。
アトミック操作に関する質問
Redis Luaスクリプト内で読み取り・変更・書き込みを行うほうが、アプリケーションコードで行うより安全なのはなぜですか?
復習:アトミック操作とトランザクション
アトミックな読み取り・変更・書き込み、CAS、分散ロックにはRedis Luaスクリプトを使用します。読み取り値に依存する操作では、LuaスクリプトのほうがMULTI/EXECより単純で、正しく実行できます。スクリプトは最小限に保ち、同時実行下でテストします。
よくある質問
「アトミック操作とトランザクション」レッスンは無料ですか?
はい。「アトミック操作とトランザクション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「アトミック操作とトランザクション」で何を学びますか?
Luaスクリプトで複数段階のRedis操作をアトミックに実行します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「アトミック操作とトランザクション」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- EVALとRedis Lua環境
- アトミック操作とトランザクション
- Luaによるレート制限
- SCRIPT LOADとEVALSHA