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

やあ。Redisの世界へようこそ。
アーキテクチャの深淵を覗き込むような技術も面白いけれど、今日はもっと身近で、かつRedisの「賢さ」を最大限に引き出すための魔法について話をしよう。

テーマは `SCRIPT LOAD` コマンド。
名前だけ聞くと難しそうだけど、実はこれ、Redisを「ただの物置」から「最強の執事」へと進化させるための鍵なんだ。

—

1. なぜ「スクリプト」が必要なのか?

想像してみてほしい。君が毎朝、コーヒーを淹れて、トーストを焼き、新聞をテーブルに置くという「一連の作業」を、いちいち誰かに口頭で指示していたらどうだろう?

「まずは豆を挽いて」「次に湯を沸かして」「それからパンを焼いて」……と細かく指示するのは面倒だし、時間がかかるよね。

Redisも同じだ。
例えば、「Aさんのポイントを減らして、その分をBさんに足し、ついでに履歴を記録する」といった複数の操作を一度に行いたいとき、いちいちサーバーと往復していたらネットワークの遅延でパフォーマンスが落ちてしまう。

そこで登場するのが Lua(ルア)スクリプト だ。
「この一連の作業を、まとめてやっておいて!」とRedisにお願いして、それを保存しておく仕組み。そのための第一歩が `SCRIPT LOAD` なんだよ。

—

2. 「SCRIPT LOAD」は、料理の「レシピ登録」

`SCRIPT LOAD` は、サーバーの中に「レシピ」を保存する作業だと考えていい。

「Aさんのポイントを減らして、Bさんに足す」という命令をLuaで書く
実際にはもっと複雑な処理も可能だよ
SCRIPT LOAD “local a = redis.call(‘get’, KEYS[1]); redis.call(‘decrby’, KEYS[1], ARGV[1]); redis.call(‘incrby’, KEYS[2], ARGV[1]); return a”

実行すると、こんな文字列が返ってくる
“e055f5664…” (これがSHA1ハッシュと呼ばれる「レシピの番号」だ)

このコマンドを打つと、Redisは「なるほど、この複雑な手順を『e055f5664…』という番号で覚えておくよ!」と返事をしてくれる。

これの何がすごいかって?
次からは、長い命令を全部送らなくていいんだ。 「例の『e055f5664…』のレシピを実行して!」と番号を伝えるだけで、Redisは瞬時に記憶を呼び出し、高速に処理を実行してくれる。

—

3. なぜ「番号(SHA1ハッシュ)」を使うの?

「そのまま名前を付ければいいじゃないか」と思うかもしれないね。でも、ここがエンジニアの知恵の出しどころだ。

  • 通信量の節約: 何百行ものプログラムを毎回送るのはネットワークの無駄だ。短い番号だけ送れば、通信は一瞬で終わる。
  • 間違いがない: どんなに長いプログラムでも、SHA1という指紋のようなIDに変換すれば、一意に特定できる。プログラムが一文字でも書き換わればIDも変わるから、意図しないコードが実行されるリスクもないんだ。

—

4. 今日から使える「魔法のフロー」

`SCRIPT LOAD` を使った、実務でよくある流れを覚えておこう。

1. LOADする: アプリケーションの起動時に、必要なスクリプトを `SCRIPT LOAD` してIDを保存しておく。
2. EVALSHAで実行する: 実際に処理したいときは、`EVALSHA` というコマンドを使って、そのIDを指定して呼び出す。

IDを指定して実行!(速い、とにかく速い!)
EVALSHA e055f5664… 2 userA userB 100

もしRedisを再起動してIDが消えてしまっても、`EVALSHA` がエラーを返してくれるから、「あ、レシピが消えてる!ならもう一度 `SCRIPT LOAD` しなきゃ」と、自動で再登録するロジックを組むのがプロの定石だね。

—

最後に:君のRedisライフを一段上に

どうかな? `SCRIPT LOAD` が、単なるコマンドではなく「Redisという執事に仕事を効率よく頼むためのプロトコル」だと感じてもらえたら嬉しい。

最初は難しく見えるコマンドも、「どうすれば効率的に、そして賢くデータを扱えるか?」という視点で見れば、どれも愛おしいツールに見えてくるはずだよ。

ここをクリアすれば、君のRedis運用はもう「初心者」のレベルじゃない。
次は、このスクリプトの中にどんな複雑なロジックを詰め込むか、ぜひ君自身の手で試してみてほしい。

また何か壁にぶつかったら、いつでも聞きに来て。君のエンジニアリングライフを、心から応援しているよ。

コメント

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