Webサービスを使ってると、「なんでこんなに速いんだろう?」って思うことあるよね。実は、その裏側では「データを賢く保管する」という工夫が隠れてるんだ。その工夫の一つが「Redis(レディス)」という技術。この記事を読めば、Redisがどんなもので、なぜ世界中で使われてるのかがわかるよ。
- Redisはメモリ上に直接データを保存するデータベースで、ハードディスクより桁違いに速い
- ログイン情報やトレンド情報など一時的なデータを保管するのに向いている
- Twitterなど大規模サービスが高速化のために使ってる重要な技術
もうちょっと詳しく
Redisは単なるメモリデータベースじゃなくて、実はいろいろな機能を持ってる。「キー・バリュー型」(つまり「鍵・値型」。例えば「ユーザーID: 12345」→「ユーザー名: 太郎」みたいに、「何か」と「それの内容」をセットで保管する方式)というシンプルな設計だから、プログラマーから愛されてるんだ。さらに、データを一時的に保管するだけじゃなくて、複数のサーバーで同じデータを共有したり、「このデータは1時間後に自動削除」みたいな設定もできたり。こういう「手軽さと柔軟性」が、世界中で使われてる理由なんだよ。
Redisは「速さ」と「シンプルさ」のバランスが完璧。だから、どんなサービスでも使いやすいんだ。
⚠️ よくある勘違い
→ 違う。Redisはメモリなので電源を切ったら消える。だから「永遠に残さないといけないデータ」(例えば、ユーザーが投稿した日記とか)はダメ。Redisと普通のデータベース(SQLitとかPostgreSQLとか)を組み合わせて使うんだ。
→ 正解。Redisで一時的なデータを超高速に処理して、消えてもいいデータはメモリに、残しておくべきデータは普通のデータベースに、って使い分けるんだよ。
[toc]
Redisって、そもそも何?
Redisの正式名は「Remote Dictionary Server」っていう。つまり「遠くにある辞書型のサーバー」ってことだね。辞書型ってのは、つまり「単語と意味の組み合わせ」みたいなもので、「○○という鍵に対して、▲▲という値が入ってる」という形でデータを保管する方式のこと。例えば、あなたの名前が「太郎」で、ユーザーIDが「12345」なら、「12345」という鍵に対して「太郎」という値が入ってる、みたいな感じだね。
Redisは、このシンプルな「鍵と値」の組み合わせでデータを保管して、それをメモリに直接入れちゃうから、アクセス速度が超速いんだ。通常のデータベース(SQLiteとかPostgreSQLとか)だと、ハードディスク上に「テーブル」という形で複雑に整理されてるから、目的のデータを探すのに時間がかかる。でもRedisは、メモリという「パソコンの脳みそ」に直接入れてるから、脳みそから「あ、この情報か」って一瞬で引き出せるイメージだね。
だから「毎秒何万回もアクセスされるけど、ずっと保管する必要はない」というデータに、Redisは最適なんだ。Twitterでトレンドワードがリアルタイムで変わるけど、それは毎秒何千万回もアクセスされるデータだからね。そいつを普通のデータベースに入れてたら、ハードディスクがパンパンになっちゃう。だからRedisを使って、メモリに一時的に置いて、高速に処理するわけだ。
Redisの生まれた背景
Redisは2009年に、Salvatore Sanfilippo(サルヴァトーレ・サンフィリッポ)というイタリア人のプログラマーによって作られた。当時、ウェブサービスが急速に大きくなってて、「今のデータベースじゃ、アクセス速度が追いつかない」という問題が出てきたんだ。例えば、オンラインショッピングサイトで、ユーザーが商品をカートに入れたときに「カートの中身」が何万人分も存在するけど、これを普通のデータベースに保管したら、毎回ハードディスクから読み込まないといけなくなる。それで遅くなっちゃう。
そこで「ならメモリに直接入れちゃえば、超速いじゃん」って発想から生まれたのがRedis。シンプルだけど、ものすごく賢い設計だったから、すぐに世界中のサービスで使われるようになったんだ。今では、Twitter、Instagram、Amazon、Netflix……こういう巨大なサービスはみんなRedisを使ってる。
Redisの役割:「キャッシュ」と「セッション管理」
Redisの最大の役割は、つまり「データを一時的に保管する倉庫」ってこと。そのデータの使い方は、大きく分けて2つあるんだ。1つは「キャッシュ」で、もう1つは「セッション管理」。この2つが、Redisの使い方の9割を占めるんだよ。
キャッシュとは
キャッシュってのは、つまり「よく使うものを、すぐ取れる場所に置く」ってこと。例えば、あなたが毎日使う教科書は、機械とかセーフティボックスの奥に閉まらず、机の上に置いてある。だから朝起きて「今日は数学だ」って思ったら、すぐに机から教科書を取れるよね。でも、10年後に使うかもしれない参考書は、奥の棚に閉まってある。取るのに時間がかかるけど、今は別にいらないからいい。このイメージが「キャッシュ」だね。
ウェブサービスでも同じことが起きてる。例えば、Twitterを開くと「今のトレンドワード」が表示されるけど、この情報は毎秒何千万人がアクセスするし、ちょっと古いデータでもいい(1秒前のトレンドと1秒後のトレンドって、そこまで変わらないもんね)。だから、この情報を普通のデータベース(ハードディスク)に入れるんじゃなくて、Redisというメモリに入れて、「この情報が必要な人は、ここから持って行ってね」って設定する。そうすると、毎秒何千万回のアクセスでも、一瞬で返せるんだ。
もう一つの例は、Amazonの「検索結果」。誰かが「iPhone」と検索したら、その検索結果(「iPhone 13」「iPhone 14」「iPhone 15」……みたいなリスト)を、1時間とか1日の間、Redisに保管する。そうしたら、次に誰かが同じ「iPhone」と検索したときに、ハードディスクから毎回検索し直すんじゃなくて、Redisから一瞬で返せる。これで超高速になるんだ。
セッション管理とは
セッション管理は、つまり「このユーザーは今ログイン中です」という情報を保管することだね。例えば、あなたがTwitterにログインしたとき、Twitterは「あ、このユーザーは今ログイン中だ」ってことを記録しないといけない。そうじゃないと、ツイートを投稿しようとしたときに「あれ、誰がこのツイートを投稿してるの?」ってわからなくなっちゃう。
この「ログイン情報」を、普通のデータベース(ハードディスク)に保管すると、毎回ハードディスクにアクセスしないといけなくなる。だから、Redisに保管して、「このユーザーID『12345』は、今ログイン中」という情報を、メモリに直接入れる。そうすると、ユーザーが何かアクション(ツイート投稿とか、いいねとか)をするたびに、一瞬でそのユーザーの情報を確認できるんだ。
さらに、Redisには「この情報は30分後に自動削除」みたいな設定ができるんだ。つまり、ユーザーが「何もしないまま1時間経つ」と、自動的にログアウトされるみたいなやつだね。あれはRedisが「あ、この情報は30分前に作られたのに、まだ更新されてないな。それじゃ削除しちゃおう」って自動で判断してくれるから、できるんだ。
Redisの仕組み:メモリに直接データを置く
では、Redisがなぜそんなに速いのか。その秘密は「メモリに直接データを置く」という仕組みにあるんだ。
通常のデータベースの仕組み
通常のデータベース(SQLitとかPostgreSQLとか)は、ハードディスク上に「テーブル」という形でデータを整理する。例えば「ユーザーテーブル」には「ユーザーID」「名前」「メールアドレス」みたいなカラム(つまり「列」。表計算ソフトで言う「Aの列」みたいなやつ)があって、各ユーザーの情報が行(つまり「行」。表計算ソフトで言う「1行目」みたいなやつ)として入ってる。
何か情報が必要になったら、「ユーザーID『12345』の『名前』を取ってこい」という命令を出す。すると、データベースが「あ、『ユーザーテーブル』の『ユーザーID列』で『12345』を探そう」って動く。そして、ハードディスク上でそのデータを見つけて、それをメモリに読み込んで、あなたのプログラムに返す。この「見つけて」「読み込んで」という処理に時間がかかるんだ。
Redisの仕組み
でもRedisは、最初からデータをメモリに置いちゃう。だから「ユーザーID『12345』の『名前』を取ってこい」という命令が来たら、メモリから一瞬で「太郎」って返せる。ハードディスクを読み込む時間がゼロだから、超速いわけだ。
でも「全員のデータをメモリに置いたら、メモリが足りなくなるじゃん」って思うよね。その通り。だから、Redisに入れるのは「一時的なデータ」だけなんだ。「今、ログインしてるユーザーの情報」とか「今人気のトレンドワード」とか、「ずっと保管する必要はないデータ」だけ。永遠に保管しないといけないデータ(ユーザーが投稿した記事とか、ユーザーの初期登録情報とか)は、普通のデータベースに入れておく。
実際の使い方
だから、大きなサービスは、だいたい「普通のデータベース + Redis」という組み合わせを使ってるんだ。例えば、Twitterの場合、ユーザーが投稿した「ツイート」は全部、PostgreSQL(つまり普通のデータベース)に保管される。でも「今、何がトレンド中か」という情報は、Redisに一時的に保管される。「このユーザーは今ログイン中か」という情報も、Redisに一時的に保管される。こうすることで「永遠に残さないといけないデータは安全に保管して、ちょくちょくアクセスされるデータは超高速に返す」という両方が実現できるんだ。
Redisを使う理由:スピードと手軽さ
なぜ、みんなRedisを使うのか。理由は、シンプルに言えば「スピード」と「手軽さ」だね。
スピードの面
Redisはメモリにデータを置くから、アクセス速度が普通のデータベースの何倍〜何十倍も速い。具体的には、普通のデータベースは1回のアクセスに、だいたい10〜100ミリ秒かかる(0.01〜0.1秒)。でもRedisは、だいたい1ミリ秒以下(0.001秒以下)でアクセスできる。100倍以上速いんだ。
これが何を意味するかっていうと、例えば、Amazonで商品を検索したときに、表示されるまでの時間が、100倍速くなるってことだね。通常のデータベースなら「ちょっと待ってください……」って2秒かかるところが、Redisを使ったら、0.02秒で表示される。これが「ユーザー体験」を大きく改善するんだ。
手軽さの面
もう一つは「手軽さ」。Redisは「鍵と値」という超シンプルな仕組みだから、プログラマーが簡単に使える。通常のデータベースは、複雑な「テーブル設計」(どんな形でデータを整理するか)をしないといけない。でもRedisは「この値を『ユーザー:12345』という鍵に入れるだけ」という感じで、本当にシンプルなんだ。
だから、新しい機能を追加したいときに「Redisに一時的にこのデータを入れようかな」って、さくっと追加できる。普通のデータベースなら「テーブル設計を変えて、マイグレーション(つまり「既存のデータを新しい形に変換する」という作業)をしないといけないから大変だけど、Redisなら簡単なんだ。
Redisの注意点:永遠には保存されない
でも、Redisには大きな制限がある。つまり「電源を切ったら、データが全部消える」ってこと。
メモリは一時的
Redisはメモリに直接データを入れるから、パソコンの電源が切れたら、そのデータは全部なくなっちゃう。例えば、あなたのスマホを再起動したら、メモリ上のデータは全部消えるよね。それと同じだね。だから、Redisに「ユーザーが投稿した日記」みたいに「永遠に保管しないといけないデータ」を入れたら、もし停電とかで電源が切れたら、その日記は全部消えちゃう。これは大問題だね。
だから、Redisに入れるのは「失くなってもいいデータ」だけなんだ。「今、この瞬間のトレンドワード」「今、ログインしてるユーザーの一覧」「ユーザーが今まさに見てるページの情報」……こういった「一時的なデータ」ならOK。でも「ユーザーが一生かけて書き溜めた日記」「月給として定期的に支払われる額」みたいな「永遠に保管しないといけないデータ」は、普通のデータベース(ハードディスク)に入れないといけない。
Redisの「永続化」機能
ただ、Redisにも工夫があってね。実は「永続化」(つまり「メモリのデータをハードディスクに定期的に保存する」という機能)という機能がある。これを使うと、Redisのデータを、定期的にハードディスクにコピーして保存できるんだ。そうすると、もし停電で電源が切れても、ハードディスクに保存されてる最後のデータまで復元できる(その後のデータは消えちゃうけど)。
でも、この「永続化」を使うと、Redisの速度がちょっと落ちる(だいたい10〜20%くらい)。だから「本当に大事なデータは普通のデータベースに入れて、一時的なデータはRedisに入れるけど、永続化はしない」という使い方が、一般的だね。
だからこそ「組み合わせ」が大事
だから、大事なのは「Redisと普通のデータベースを組み合わせて使うこと」なんだ。ユーザーが新しい日記を投稿したら、その日記は「すぐにPostgreSQL(普通のデータベース)に保存」して、同時に「Redisにも一時的に保存」する。こうすると「永遠に保管できて」「アクセスも速い」という両方が実現できるんだよ。
