やあ。Redisの世界へようこそ。
Redisを「単なる高速な辞書」だと思っているなら、それはまだ入り口に立ったばかりだよ。
今日は、Redisが誇る強力な武器の一つ、「ハッシュ型の数値演算」について話をしよう。プログラミングにおいて、数字を数えたり、合計を出したりするのは日常茶飯事だよね? でも、それを「安全に」「高速に」行うのは意外と難しい。
Redisを使えば、その悩みは一瞬で消える。なぜなら、Redisは「アトミック(不可分)」という魔法を使えるからだ。
さあ、肩の力を抜いて、一緒に学んでいこう。
—
1. なぜ「ハッシュ」を使うのか?
まずはイメージしてみてほしい。君がオンラインショップのシステムを作っているとする。商品ごとに「在庫数」や「閲覧数」を管理したいよね。
もし商品が1,000個あったら、1,000個の独立したキーを作るだろうか? いや、それは部屋に1,000個のバラバラの箱を置くようなものだ。管理が大変だよね。
Redisのハッシュ(Hash)は、一つの大きな「タンス」のようなものだ。
一つのタンスの中に「引き出し」がたくさんあり、その引き出し一つひとつに名前(フィールド)を付けて、値をしまっておける。
- タンスの名前: `product:101`
- 引き出しの名前(フィールド): `stock`(在庫), `views`(閲覧数)
これなら、商品ごとにタンスを一つ用意するだけで済む。整理整頓ができて、非常に効率的だ。
—
2. 数値を直接いじる魔法:HINCRBY
さて、本題の「数値演算」だ。
普通、プログラミングで「在庫を1減らす」処理をするときは、こんな手順を踏むよね。
1. 今の在庫を読み出す(10個だ!)
2. プログラムで1引く(10-1=9)
3. 新しい値を保存する(9個になった!)
でも、もしこの瞬間に別の誰かが同時に在庫を買おうとしたらどうなる? 読み書きのタイミングがズレて、在庫計算が狂ってしまうことがある。これが「競合」という悪夢だ。
ここで登場するのが `HINCRBY` だ。
商品ID 101 の stock(在庫)を -1 する
HINCRBY product:101 stock -1
結果:在庫が安全に1つ減る。これだけで完了!
`HINCRBY` は、「今の値を読み取って、計算して、書き込む」という一連の作業を、Redisの中で一瞬でやってのける。 外からは「一瞬で終わった」ようにしか見えない。だから、他の誰かが邪魔をすることはない。これが「アトミック(不可分)」の強さだ。
—
3. 小数点も怖くない:HINCRBYFLOAT
次は「売上管理」だ。売上は整数とは限らないよね。そんなときは `HINCRBYFLOAT` を使おう。
商品ID 101 の total_sales(売上合計)に 120.5 を足す
HINCRBYFLOAT product:101 total_sales 120.5
結果:売上が正確に加算される
これも使い方は同じ。小数点が含まれていても、Redisは正確に計算してくれる。
—
4. 今日から使える実践テクニック
まとめると、こんな風に活用できるよ。
| やりたいこと | コマンド例 |
| :— | :— |
| 初めての登録 | `HSET product:101 stock 10` |
| 在庫を増やす | `HINCRBY product:101 stock 5` |
| 在庫を減らす | `HINCRBY product:101 stock -1` |
| 売上に加算 | `HINCRBYFLOAT product:101 revenue 1500.50` |
先輩からのアドバイス
初心者のうちは、「計算はプログラム側(JavaやPythonなど)でやるもの」と考えがちだ。でも、Redisのような「データの近くで計算する」設計を覚えると、君が作るシステムは劇的に速く、そしてバグに強いものになる。
「データはRedisに任せて、計算もRedisに任せる」
これが、高負荷なシステムを支えるエンジニアの基本戦略だ。
ここをクリアすれば、Redisのハッシュはもう君の庭のようなもの。次は、このタンスの中身をどうやって取り出したり、監視したりするかを一緒に見ていこう。
焦らず、一歩ずつ進んでいこうね。君なら必ずマスターできるよ。
コメント