こんにちは。Redisの世界へようこそ。
Redisを使い始めると、最初は「データの保存と取り出し」というシンプルな操作が楽しくなりますよね。でも、少し慣れてくると「もっと効率的に、もっと素早く処理したい」という欲が出てくるはずです。
今日は、Redisの「職人技」とも言える`EVALSHA`というコマンドについてお話しします。難しそうな名前に見えますが、考え方はとてもシンプルです。一緒に紐解いていきましょう。
—
「毎回説明する」のは疲れませんか?
想像してみてください。あなたはカフェの店長です。お客さんが来るたびに、メニューの作り方を一から細かく説明していたら、日が暮れてしまいますよね。
そこであなたは、「一番人気の特製レシピ」に「No.1」という名前をつけて、厨房の壁に貼っておくことにしました。
- お客さん: 「No.1のやつ作って!」
- あなた: (レシピを見なくても、壁の「No.1」を見てすぐに調理開始!)
これなら、レシピを口頭で伝える手間が省けて、提供スピードが劇的に上がります。
実は、`EVALSHA`はこれと全く同じことをRedisで行っているのです。
Luaスクリプトと「おまじない」の正体
Redisには、複数のコマンドをまとめて実行できる「Lua(ルア)スクリプト」という機能があります。
通常、このスクリプトをRedisに送ると、Redisは「なるほど、こういう手順で処理すればいいんだな」と毎回中身を解釈します。でも、スクリプトが長ければ長いほど、そのデータを送る通信量が増えてしまい、もったいないですよね。
そこで登場するのが、`SCRIPT LOAD`と`EVALSHA`です。
1. `SCRIPT LOAD`: 「このレシピをサーバーに保存してくれ」と頼む。すると、Redisは「わかった、そのレシピの指紋(ハッシュ値)は『a1b2c3…』だね」と教えてくれます。
2. `EVALSHA`: 「さっきの『a1b2c3…』のレシピを実行して!」と頼む。
たったこれだけで、長いスクリプトを何度も送る必要がなくなるのです。
—
実際にやってみよう
言葉だけではイメージしづらいと思うので、例を見てみましょう。
1. レシピを登録する
まず、一度だけスクリプトを送信して、サーバーに覚え込ませます。
「キーの値を2倍にする」という簡単な処理を登録
SCRIPT LOAD “return redis.call(‘get’, KEYS[1]) 2”
実行結果:サーバーから「b7e3…」のようなハッシュ値が返ってきます
これが「No.1」という名前の代わりです
2. ハッシュ値を使って実行する
次からは、長い処理の内容を書く必要はありません。
ハッシュ値を指定して実行(KEYS[1]に’mykey’を渡す)
EVALSHA b7e3… 1 mykey
これだけで、Redisは内部のレシピを呼び出して高速に処理します!
—
なぜこれが「伝説級」の知見なのか?
初心者のうちは「別に普通にコマンドを送ればいいのでは?」と思うかもしれません。しかし、大規模なシステムになればなるほど、この差は決定的になります。
- 通信のダイエット: ネットワークを行き来するデータ量が減れば、それだけシステムは軽快になります。
- サーバーの負荷軽減: サーバー側で「今から何をするか」を解析するコストが省けます。
- 原子性(アトミック): Luaスクリプトとして実行することで、途中で他の処理に割り込まれることなく、最後まで一気に処理が完了します。これはRedisにおける「最強の安全策」です。
ここをクリアすれば、Redisはあなたの武器になる
`EVALSHA`を使いこなせるようになると、あなたは単なる「利用者」から「Redisのパフォーマンスを最大限引き出すエンジニア」へと一歩進化します。
「何を送るか」ではなく「どう効率的に伝えるか」。この視点を持てるようになったら、Redisの基本はもうバッチリマスターしたと言っていいでしょう。
最初は難しく感じるかもしれませんが、まずは小さなスクリプトを一つ登録して、`EVALSHA`で呼び出すところから始めてみてください。「おっ、速いぞ」と実感できる瞬間が必ず訪れます。
何か詰まったら、いつでも聞きに来てくださいね。応援しています!
コメント