やあ。Redisの世界へようこそ。
Redisを「単なる高速なキャッシュ」だと思っているなら、それは非常にもったいない。この小さな巨人は、実は非常に巧妙なアーキテクチャで動いているんだ。
今日は、Redisにおける「トランザクション(MULTI/EXEC)」と、それに欠かせない「WATCH」という仕組みについて話そう。教科書的な定義を並べるつもりはない。エンジニアとして現場でどう捉えればいいのか、本質を紐解いていくよ。
—
Redisの「トランザクション」は、僕たちが知っているものとは少し違う
一般的なデータベース(MySQLなど)でのトランザクションといえば、ACID特性(特にAtomicity/原子性)が厳密に守られ、失敗すれば綺麗に「なかったこと」にできる(ロールバック)のが当たり前だよね。
でも、Redisは少し違うんだ。「Redisのトランザクションは、あくまで『コマンドの詰め合わせを順番通りに実行する』という予約システム」だと考えてほしい。
なぜ「ロールバック」がないのか?
Redisにロールバック機能がないのは、設計思想が「シンプルさと速度」に全振りされているからだ。複雑な例外処理を捨てたことで、あの圧倒的なパフォーマンスを実現している。もしRedisに複雑なロールバックを実装したら、今のRedisの速さは消えてしまうだろう。
「失敗した時に勝手に元に戻してくれる」という甘えは捨てて、「失敗しないように手順を組む」のがRedis流の作法なんだ。
—
MULTI / EXEC の正体:予約と実行
例えるなら、「レストランの注文」だ。
1. MULTI: 「これから注文するよ!」という宣言。
2. コマンドの入力: 注文内容をメモする(まだ料理は作られない)。
3. EXEC: 「全部まとめて持ってきて!」という合図。ここで初めて、キッチン(Redis)が動き出す。
1. MULTIでトランザクション開始
MULTI
OK
2. コマンドを予約(この時点ではまだ実行されない)
SET user:100:name “Alice”
QUEUED(予約された!)
INCR user:100:visits
QUEUED(予約された!)
3. EXECで一気に実行
EXEC
1) OK
2) 1
ポイントは、`EXEC`を叩くまでは、何一つとしてデータは変化しないということだ。
—
楽観的ロック「WATCH」:横取りを防ぐ賢いやり方
さて、ここで問題が発生する。「もし、僕が注文を考えている間に、誰かが勝手にキッチンの食材を全部変えてしまったら?」
マルチユーザー環境では、複数の処理が同時に走る。そんな時に登場するのが`WATCH`だ。これは「この食材を見張っておいて!」という監視コマンドだ。
WATCHの仕組み
1. WATCH: 「このキーを監視するよ」と宣言する。
2. MULTI: 処理の準備。
3. もし誰かが監視中のキーを変更したら: Redisは「おっと、君が監視していたデータが書き換えられたよ!」と教えてくれる。
4. EXECの結果: `nil`(空)が返ってくる。つまり、「他人が横取りしたから、今回のトランザクションは無効だよ」と教えてくれるんだ。
ユーザーAが残高をチェック
WATCH balance
OK
(この隙に、別の処理が balance を書き換えてしまうとする)
MULTI
DECRBY balance 100
EXEC
(nil) -> 失敗!誰かに書き換えられたから実行しなかったよ
これを「楽観的ロック」と呼ぶ。「たぶん他の人は触らないだろうけれど、もし触られたら潔く諦めてやり直そう」という、非常に効率的な戦略なんだ。
—
初学者が必ず押さえるべき「極限の知見」
最後に、現場で戦うためのアドバイスを贈ろう。
- エラーの性質を見極める: Redisのトランザクション実行中にエラーが出ても、他のコマンドは止まらない。構文エラー(コマンド間違い)なら予約すらされないが、実行時エラー(型の間違いなど)は無視して次へ進む。これがRedisだ。
- WATCHは使いすぎない: `WATCH`を貼っている間、そのクライアントは常に監視コストを払っている。本当に競合が予想されるクリティカルな部分だけに絞ること。
- 困ったら Lua スクリプト: 「`WATCH`でのやり直しループが面倒だな」と思ったら、Redis上で動く「Luaスクリプト」を検討しよう。Luaスクリプトは、その実行中は他のコマンドが一切割り込めない「究極の直列実行」を保証する。これがRedisの真の最強の武器だ。
—
どうだい?Redisのトランザクションが、「ただのコマンドの束」ではなく「競合と戦うための戦略」に見えてきただろう。
まずは`MULTI/EXEC`でコマンドを予約する感覚を掴み、必要に応じて`WATCH`でガードを固める。このリズムが身につけば、君はもうRedisの基本を完全にマスターしたと言っていい。
何か詰まったら、いつでも聞いてくれ。エンジニア同士、いいコードを書こうじゃないか。
コメント