やあ。Redisの世界へようこそ。
Redisを触り始めると、必ず「トランザクション」という概念に出会うはずだ。その心臓部である`EXEC`コマンドについて、今日は語らせてほしい。
多くの解説書は「アトミックに実行する」なんて難しい言葉を使うけれど、そんなものは忘れていい。君が今日持ち帰るべきは、「Redisは、一度決めたら最後までやり遂げる職人である」というイメージだ。
さあ、紐解いていこう。
—
1. `EXEC`は「注文票」を確定させるボタン
想像してみてほしい。君が超人気のカフェで、店員さんに「これと、あれと、それも追加で!」と次々に注文を伝えている状況を。
Redisの世界では、`MULTI`というコマンドを打った瞬間から「注文開始モード」になる。
1. `MULTI`: 「よし、今から注文を伝えるぞ(ここから先はまだ作らないでくれ)」
2. コマンドをいくつか入力: 「コーヒー一つ」「サンドイッチ一つ」「ケーキ一つ」
3. `EXEC`: 「はい、今の注文をまとめて今すぐ作ってくれ!」
この`EXEC`こそが、溜め込んだコマンドを一気に、かつ「他の誰にも邪魔させず」に処理するトリガーなんだ。
2. なぜ「途中で邪魔されない」ことが重要なのか?
これがRedisの本質だ。もし、君が注文をしている最中に、別の客が横から「ケーキを全部買い占めたい!」と割り込んできたらどうなる?
`EXEC`を使わないでバラバラにコマンドを送ると、君の注文の間に別の命令が入り込んでしまい、データがめちゃくちゃになる可能性がある。
しかし、`MULTI`から`EXEC`までの間、Redisは「君の専用カウンター」として他の客をシャットアウトする。`EXEC`が実行されるその瞬間まで、他の誰も君のデータに触れさせない。これが「アトミック(不可分)」という言葉の正体だ。
3. 実践:注文票を作ってみよう
実際にコードを書いてみよう。シンプルでいい。
1. 注文を開始する宣言
127.0.0.1:6379> MULTI
OK
2. 注文内容をキュー(待機列)に入れる
まだ実行されず、「QUEUED」という返事が返ってくるはずだ
127.0.0.1:6379> SET user:100:name “Alice”
QUEUED
127.0.0.1:6379> INCR user:100:login_count
QUEUED
3. 確定!一気に実行する
127.0.0.1:6379> EXEC
1) OK # SETの結果
2) (integer) 1 # INCRの結果
どうだい? `QUEUED`という表示が、「まだ実行はしていない、予約を受け付けたぞ」というRedisの声に聞こえてこないかな。
4. 知っておくべき「職人の流儀」
ここで、少しだけプロの視点を共有しておこう。Redisのこの仕組みには、一つだけ重要なルールがある。
「失敗しても、他の作業は止まらない」
もし、君が注文した内容の中に「存在しないコマンド」や「明らかに不可能な操作」が含まれていた場合、Redisは`EXEC`の瞬間に「あ、ここだけ無理だわ」と判断する。でも、可能なものは最後までやり遂げるんだ。
これはデータベースのトランザクション(全部成功するか、全部取り消すか)とは少し違う。Redisのトランザクションは、「キューに入った命令を、順番通りに、誰にも邪魔されずに実行する」ことに特化している。だからこそ、爆速なんだ。
まとめ:ここさえ掴めばマスターしたも同然
今日の要点はこれだけだ。
- `MULTI` で注文モードに入る。
- コマンドを並べる。まだ実行はされない。
- `EXEC` で一気に確定させる。これが「アトミック」の魔法。
この感覚さえ掴めば、君はもうRedisの基本を半分以上クリアしたようなものだ。複雑なシステムを組むとき、この「一括処理の安心感」が君を支えてくれるはずだよ。
何か不安なことがあれば、いつでも聞いてくれ。エンジニアとしての旅は、まだ始まったばかりだ。楽しんでいこう!
コメント