やあ。Redisの世界へようこそ。
Redisを学び始めると必ずぶつかる壁、それが「データの一貫性」だ。今日はその難所を突破するための強力な武器、『WATCHコマンド』について、肩の力を抜いて一緒に紐解いていこう。
ここをクリアすれば、Redisを単なる「高速な箱」から「信頼できるシステムの核」へと進化させることができるようになる。準備はいいかな?
—
「WATCH」とは何か?:日常で例えるなら「監視カメラ」
プログラミングで複数の人が同時に同じデータを書き換えようとすると、データが壊れてしまう事故が起きる。これを防ぐための「楽観的ロック(Optimistic Locking)」という考え方があるんだけど、Redisではこのために`WATCH`を使う。
難しく考えないでほしい。`WATCH`は「監視カメラ」だ。
あなたが銀行の窓口担当だと想像してほしい。
1. あなたは、ある顧客の預金残高(データ)を「監視」し始める。
2. その隙に他の人が残高を書き換えていないか、カメラがチェックし続ける。
3. もし誰かが書き換えたら、カメラが「おい、データが変わったぞ!」と教えてくれる。
4. その通知を受けたら、あなたは「あ、じゃあこの取引は最初からやり直そう」と判断する。
これが`WATCH`の正体だよ。
—
基本のステップ:これだけ覚えればOK
`WATCH`は必ず`MULTI`(トランザクションの開始)と一緒に使う。流れはこうだ。
1. WATCH: 「このデータ、誰か手を出さないか見張っておくよ」
2. GET: 今の値を読み取る。
3. MULTI: 「ここから先の命令をまとめて実行してくれ」
4. SET: 読み取った値をもとに計算して書き込む。
5. EXEC: 「今まで監視していたデータが誰にも触られていなければ、書き込んでくれ!」
もし`EXEC`の瞬間に誰かがデータを変えていたら、Redisは「ごめん、誰か先に書き換えちゃったから失敗にしたよ(nilを返す)」と答えてくれる。
—
実践:コードで動きを見てみよう
例として「ポイント残高」を安全に加算する処理を書いてみるね。
1. 監視を開始(ポイントのキーを監視下に置く)
WATCH points
2. 現在のポイントを取得
GET points
=> “100” が返ってきたと仮定
3. トランザクション開始
MULTI
=> OK
4. 100 + 50 = 150 を書き込む予約
SET points 150
=> QUEUED
5. 実行!
EXEC
=> 誰にも邪魔されていなければ「OK」が返る。
もしこの間に他の誰かが値を書き換えていれば、ここは「(nil)」が返る。
—
なぜこれが「最強」なのか?
初心者のうちは「失敗したらやり直すなんて面倒じゃない?」と思うかもしれない。
でも、この仕組みは「ほとんどの場合は競合しない」という前提のシステムにおいて、最高に効率が良いんだ。わざわざ鍵をかけて全員を待たせる(悲観的ロック)よりも、監視だけしておいて「もし衝突したらその時だけやり直す」ほうが、圧倒的に高速で、システム全体がスムーズに回るんだよ。
先輩エンジニアからのアドバイス
`WATCH`を使う上で一つだけ大切な心構えがある。
「失敗した時のリトライ処理」を忘れないこと。
`EXEC`が失敗して`nil`が返ってきたら、プログラムは「あ、失敗した。もう一回最初からやり直そう」というループを回す必要がある。これが「楽観的ロック」の作法なんだ。
—
まとめ
- WATCHは、データが書き換えられていないか見守る監視カメラ。
- EXECの瞬間に、誰かが裏で書き換えていたら、その操作は潔く捨てる。
- 失敗したらリトライ。これがデータの一貫性を保つためのスマートな戦い方。
どうだい?少しだけRedisの奥深さが伝わったかな。この`WATCH`を使いこなせれば、君はもう単なる初心者じゃない。データの整合性に責任を持てる、頼れるエンジニアへの第一歩を踏み出したんだ。
さあ、次は実際に手を動かして、わざと競合させてエラーを出してみよう。失敗を知ることは、成功への最短ルートだよ。応援しているよ!
コメント