【入門編】 SCRIPT KILLコマンド – Redis

こんにちは!Redisの奥深い世界へようこそ。
今日は、現場でエンジニアが冷や汗をかく瞬間――そう、「暴走したプログラムをどう止めるか」というテーマについてお話しします。

取り上げるのは`SCRIPT KILL`というコマンドです。
「なんだか物騒な名前だな…」と思いましたか?その通り、こいつは緊急停止ボタンです。

でも、安心してください。今日ここでお話しする内容をしっかり理解すれば、万が一のトラブルでも冷静に対処できるようになります。さあ、一緒にRedisの裏側を覗いてみましょう!

—

1. なぜLua(ルア)スクリプトは暴走するのか?

Redisには、複数の操作をまとめて一瞬で実行する「Luaスクリプト」という強力な機能があります。
例えるなら、「職人がパパッと手際よく複数の仕事を一瞬で片付けるマジック」のようなものです。

しかし、この職人、たまにうっかりミスをします。

  • 無限ループに入ってしまい、いつまで経っても仕事が終わらない(「あれ?終わらないぞ…?」)。
  • 処理するデータが多すぎて、Redisが固まってしまった。

職人がフリーズしてしまうと、他の人からの注文(ほかのクライアントからのリクエスト)が一切受け付けられなくなってしまいます。Redisは基本的に「一人でコツコツ働く職人タイプ(シングルスレッド)」なので、ひとつの仕事でフリーズすると、店全体がストップしてしまうのです。

そんなときに出番となるのが、`SCRIPT KILL`(緊急停止ボタン)です。

—

2. `SCRIPT KILL` の正体と、その「優しいルール」

この緊急停止ボタン、押すときにはとても大切なルールがあります。
それは、「まだ何もデータを書き換えていない(読み取り専用の)ときだけ止めていいよ」というルールです。

なぜこんなルールがあるのでしょうか?日常の例えで考えてみましょう。

> 【レストランの厨房のたとえ】
> 料理人がスープの味見(データの読み取り)をしている途中で、「あ、それ違う!」と止めるのは簡単です。スープを捨てるだけですからね。
> しかし、すでに肉を切り分け、お皿に盛り付け、ソースをかけ始めている(データの書き込み・更新を行っている)途中で、無理やり「ストップ!」と包丁を取り上げたらどうなるでしょう?
> 厨房はぐちゃぐちゃになり、料理は中途半端な状態で台無しになってしまいます。

Redisもこれと全く同じです。
もしスクリプトがすでにデータベースのデータを書き換えている途中で強制停止させたら、データが中途半端に壊れてしまう危険性があります。そのため、書き込みが始まってしまったスクリプトは、`SCRIPT KILL` では止められないようになっているのです。

—

3. 実際に使ってみよう(コードと解説)

それでは、実際にこのコマンドを使う場面をシミュレーションしてみましょう。

ステップ1:暴走したスクリプトを放り込む(イメージ)

例えば、終わりが見えないループをするスクリプトをRedisに実行させたとします。

— 終わらない無限ループの例(絶対に真似しないでね!)
while true do
— 何もしないでぐるぐる回る
end

ステップ2:別の窓から「止まれ!」と叫ぶ

Redisがフリーズしたら、別のターミナル(操作画面)から、あのコマンドを実行します。

緊急停止コマンドを送信!
SCRIPT KILL

うまくいくと、Redisは以下のように答えてくれます。

OK

これで暴走したスクリプトが無事に停止し、Redisに平和が戻ります!

もし「書き込み」が始まっていたら…?

もし、そのスクリプトがすでにデータの書き換えを行っていた場合、`SCRIPT KILL` を押してもRedisは冷たくこう返してきます。

(error) ERR Unsupported command or
not possible to sync / kill currently
running script.

(訳:「ごめん、すでに書き込みが始まってるから、データが壊れちゃうからこのボタンじゃ止められないよ!」)

こうなってしまった場合の最終手段は、Redisサーバー自体を再起動すること(`SHUTDOWN NOSAVE` など)になりますが、これは最終手段中の最終手段です。

—

先輩からのメッセージ

いかがだったでしょうか?
`SCRIPT KILL` は、いわば「安全装置付きの緊急停止ボタン」です。

「データを壊さないために、書き込み中の暴走は止められない」というRedisの優しさ(堅牢性)を知っておくと、単なるコマンドの暗記ではなく、設計思想まで理解できたことになります。

ここをクリアできれば、あなたはもうRedisの仕組みの核心を捉えています。自信を持って次のステップに進んでくださいね。
それでは、また次回の現場でお会いしましょう!

コメント

タイトルとURLをコピーしました