【入門編】 EVALコマンド – Redis

やあ。Redisの世界へようこそ。
Redisを「ただの速いデータベース」だと思っているなら、それはまだ入り口に立ったばかりだ。今日は、Redisという巨大な城の「隠し扉」とも言える`EVAL`コマンドについて話そう。

初心者のうちは、Redisのコマンドを一つずつ順番に叩くのが基本だ。でも、仕事で複雑な処理をしようとすると、「あっちのデータを取ってきて、加工して、こっちに保存する」という手順を何度も繰り返すことになる。これ、実はすごく非効率なんだ。

そんなとき、魔法のように解決してくれるのが`EVAL`だ。さあ、一緒に扉を開けていこう。

—

1. 「おつかい」を例に考えてみよう

君が、友達の家に「お使い」に行くシーンを想像してみてほしい。

  • 普通の方法: 「牛乳を買ってきて」と言われ、お店に行って戻る。次に「卵を買ってきて」と言われ、またお店に行って戻る。これだと、何度も往復しないといけないよね。
  • EVALの方法: 「牛乳と卵を買ってきて」とメモ(スクリプト)を渡す。これなら、一度の往復で全て完結する。

Redisにとっての`EVAL`は、まさにこの「メモを渡す」行為なんだ。Redisのサーバーの中に、小さなプログラム(Luaスクリプト)を直接持ち込んで、その場で完結させる。だから、めちゃくちゃ速い。

2. EVALコマンドの正体

`EVAL`は、Redisの中で動く「小さな作業員」を操るコマンドだ。

基本の形
EVAL “スクリプトの中身” キーの数 キーの名前1 キーの名前2 … 引数1 引数2 …
EVAL “return redis.call(‘SET’, KEYS[1], ARGV[1])” 1 mykey “hello”

  • `”return …”`: ここがメモの内容だ。Luaというシンプルで強力な言語で書く。
  • `redis.call(…)`: サーバーの中にいる作業員に「このコマンドを実行しろ!」と命令する合図。
  • `KEYS`と`ARGV`: スクリプトに渡す変数。`KEYS`は扱うデータ名、`ARGV`は設定したい値だと思えばいい。

3. なぜ「最強」と言われるのか?

このコマンドがエンジニアに愛される理由は、単なるスピードだけじゃない。「原子性(アトミクス)」という、すごく大事な性質があるからだ。

もし、10個のコマンドを順番に送ったとして、途中でネットワークが切れたらどうなる? 処理が中途半端に残って、データが壊れてしまうかもしれない。
でも、`EVAL`なら「スクリプトが動いている間は、他の誰も手出しできない」というルールがある。たとえ100行の処理があっても、まるで一瞬で終わったかのように、中途半端な状態を誰にも見せないんだ。

4. 今日から使える簡単なテクニック

例えば、「今の値が0なら、1を足す」という処理を考えてみよう。普通にやると、確認と書き込みの間に別の誰かが割り込む隙があるよね。でも、これを使えば一撃だ。

— スクリプトの例:現在の値が0なら”Done”を返す
local val = redis.call(‘GET’, KEYS[1])
if val == ‘0’ then
redis.call(‘SET’, KEYS[1], ‘1’)
return ‘Success’
else
return ‘Already taken’
end

これを`EVAL`で実行すれば、君のデータはどんなにアクセスが集中しても、絶対に壊れない。

5. 先輩エンジニアからのアドバイス

`EVAL`を使うときに一つだけ覚えておいてほしいことがある。
「スクリプトを複雑にしすぎないこと」だ。

Redisは「瞬殺」が持ち味のデータベースだ。ここで何分もかかるような重たい計算をさせると、Redis全体が止まってしまう。あくまで「Redisのデータをスマートに扱うための補助」として使おう。

—

まとめ

  • EVALは「お使いメモ」: 何度も通信する手間を省いて、一撃で処理を終わらせる。
  • 安全性が高い: スクリプト実行中は他の操作が入らないから、データの整合性が崩れない。
  • 使いすぎに注意: あくまでRedisの守備範囲内で、シンプルに書くのが美学。

ここをクリアすれば、君はもうRedisの「ただの利用者」から「設計者」へと一歩踏み出したことになる。複雑なロジックをRedisの中に閉じ込めて、爆速で安定したシステムを作る楽しさを、ぜひ味わってみてくれ。

何か壁にぶつかったら、またいつでも聞きに来てほしい。応援しているよ!

コメント

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