やあ。Redisの世界へようこそ。
Redisを触り始めると必ずぶつかる「トランザクション」という壁。多くの人がここで「SQLのトランザクションと同じかな?」と混乱しがちですが、実はRedisのそれはもっとシンプルで、かつ非常に強力な哲学に基づいています。
今日は、Redisの `MULTI` と `EXEC`、そして `WATCH` について、伝説的なアーキテクトの視点から「本質」だけを抽出して解説しましょう。ここをクリアすれば、君はもうRedisの基本を完全にマスターしたと言っても過言ではありません。
—
1. トランザクションって何だろう?
エンジニアが「トランザクション」と言うとき、それは「複数の作業を、一つの塊として失敗なく終わらせる」ことを指します。
日常で例えるなら、「銀行の振込」です。
1. あなたの口座から1万円引く
2. 相手の口座に1万円足す
もし1の途中でシステムが止まったらどうなるでしょう? お金だけが消えてしまいますよね。そうならないために、「この2つの作業はセットで、最後まで成功するか、さもなくば何もしなかったことにする」という仕組みがトランザクションです。
Redisでは、これを `MULTI` と `EXEC` という命令で実現します。
2. MULTI/EXEC:魔法の「予約リスト」
Redisでトランザクションを開始するとき、頭の中に「予約リスト」を持っていると想像してください。
トランザクションの開始を宣言
MULTI
「予約リスト」にコマンドを追加
SET user:1:balance 100
INCR user:1:views
まだ実行はされない!予約されるだけ。
実行開始!
EXEC
ここが重要です: `MULTI` を叩いた瞬間、サーバーは「あ、これからは命令を実行せずにリストに溜め込むんだな」と理解します。そして `EXEC` が来るまで、Redisはひたすら命令をメモし続けます。`EXEC` が届いた瞬間に、溜め込んだ命令を一気に、誰にも邪魔されることなく実行します。
これがRedisのアトミック性(不可分性)の正体です。
3. WATCH:楽観的ロックという名の「見張り番」
さて、もう一つ重要なのが `WATCH` です。これは非常に賢い機能です。
先ほどの銀行の例で考えてみましょう。もし、あなたが振込ボタンを押した瞬間に、別の誰かがあなたの口座から引き落としをしていたらどうなるでしょう? データの整合性が壊れてしまいますよね。
ここで `WATCH` の出番です。
「このデータが変わったら教えてね」と監視を開始
WATCH user:1:balance
(ここで他の誰かがデータを書き換えたら、この後のEXECは失敗する!)
MULTI
DECRBY user:1:balance 100
EXEC
`WATCH` は「もしこのデータが実行される前に誰かにいじられたら、俺の作業は全部キャンセルするよ!」という宣言です。これを楽観的ロックと呼びます。「基本的には誰も邪魔しないだろうけど、もし邪魔が入ったら安全のためにやり直そう」という、非常に現代的で効率的なアプローチです。
4. なぜRedisはこれで十分なのか?
RDB(MySQLなど)に慣れていると、「あれ? トランザクションの途中でエラーが起きたらロールバック(取り消し)は?」と思うかもしれません。
実は、Redisの哲学は「シンプルさと高速さ」です。複雑なロールバック機構を組み込むと、メモリ上の超高速動作が損なわれてしまいます。Redisは「コマンドの文法が間違っていない限り、コマンドは必ず実行する」というスタンスをとることで、極限のパフォーマンスを実現しています。
アーキテクトからのアドバイス
初心者の方がよく陥る罠は、「トランザクション中にRedisの値を読み取って、その結果を使って次のコマンドを決める」というロジックです。
前述の通り、`MULTI` の中は溜め込まれるだけなので、途中で値を確認することはできません。もし「値を見てから判断したい」という場合は、`WATCH` を使って楽観的に処理するか、あるいはLuaスクリプトという強力な武器(これはまた別の機会に!)を使うのがRedis流の正解です。
—
まとめ
- MULTI / EXEC: 「予約リスト」を作って、一気に実行する。
- WATCH: 大切なデータを「見張り」して、他人にいじられたら潔くキャンセルする。
この2つを使いこなすだけで、君の書くコードは驚くほど堅牢になります。Redisという強力なツールを、ぜひ君の武器にしてください。
どうだい? 少しは霧が晴れたかな。何かわからないことがあれば、いつでも聞いてくれ。エンジニア同士、一緒に深淵へ潜っていこう。
コメント