Redisでセッション管理をする理由は?初心者向けに役割とメリットを徹底解説
生徒
「Webサイトにログインした後、ずっとログイン状態が続くのって、裏側で何が起きているんですか?」
先生
「それは『セッション』という仕組みを使っているからです。その情報を素早く保存するために、最近では『Redis(レディス)』というデータベースがよく使われるんですよ。」
生徒
「Redis?普通のデータベースとは違うんですか?」
先生
「はい、Redisは『メモリ』という場所にデータを保存するので、読み書きがめちゃくちゃ速いんです。遊園地のファストパスみたいなものですね!」
1. セッション管理とは何か?
インターネットでショッピングサイトやSNSを使っていると、一度ログインすれば別のページに移動しても自分の名前が表示されたままになりますよね。この「あなたは誰々さんですね」という情報を保持し続ける仕組みをセッション管理と呼びます。
Webサイトの仕組み(HTTP)は、実は「一回お願いして、一回返してもらう」という一回きりのやり取りが基本です。これをステートレス(状態を保持しない)と言います。しかし、これではページをめくるたびにログインし直さなければなりません。そこで、「セッションID」という受付番号のようなものを発行し、サーバー側でその番号に紐づいた情報を保管しておくのです。
エンジニアの必須スキル「SQL」を、 図解と豊富な練習問題でゼロから体系的に学びたい人へ。 MySQLやPostgreSQLなど、各種データベースに対応した不朽の入門書です。
SQL 第2版 ゼロからはじめるデータベース操作をAmazonで見る※ Amazon広告リンク
2. Redisとは?超高速なデータベースの正体
Redis(レディス)は、データの保存場所として「ハードディスク」ではなく「メインメモリ」を使うデータベースです。
パソコンには、データを長く保存しておく「ストレージ(HDDやSSD)」と、作業中のデータを一時的に置く「メモリ」があります。メモリはストレージに比べて読み書きのスピードが圧倒的に速いのが特徴です。
通常のデータベース(MySQLなど)が本棚から辞書を引くような速さだとしたら、Redisは机の上にメモを置いておくような速さです。セッション情報はユーザーがページをクリックするたびに確認されるため、この「速さ」がWebサイトの快適さに直結します。
3. Redisでセッションを管理する理由
なぜ、多くのプログラマーがセッション管理にRedisを選ぶのでしょうか。主な理由は以下の3点です。
- 応答速度が速い: ユーザーを待たせることなくログイン状態を確認できます。
- 有効期限を設定できる: 「30分操作がなければログアウトさせる」といった設定が、Redisの機能(TTL)で簡単に実現できます。
- 複数のサーバーで共有できる: 大規模なサイトではサーバーを何台も使いますが、Redisを中央に置くことで、どのサーバーにアクセスしても同じログイン情報を参照できます。
4. セッション情報の保存例(プログラムのイメージ)
では、実際にRedisの中にどのようなデータが入っているのか見てみましょう。RedisはKey-Value(キー・バリュー)形式といって、「鍵」と「値」のペアでデータを保存します。
例えば、セッションIDが「sess:101」のユーザーがログインした直後の状態は以下のようになります。
Key (セッションID) | Value (ユーザー情報) | TTL (残り時間)
-------------------+------------------------------+--------------
sess:101 | {"user_id": 1, "name": "山田"} | 3600秒
sess:102 | {"user_id": 2, "name": "佐藤"} | 1200秒
sess:103 | {"user_id": 3, "name": "鈴木"} | 5秒
ここで、鈴木さんのセッション(sess:103)は残り5秒で消えてしまいます。時間が経過した後の状態を、Redisの操作コマンド(SQLに似た命令)で再現してみましょう。
/* 新しいセッションを追加する命令のイメージ */
SET sess:104 '{"user_id": 4, "name": "田中"}' EX 3600;
/* 有効期限が切れたsess:103は自動で消去されます */
GET sess:103;
実行後のデータ状態は以下のようになります。
Key (セッションID) | Value (ユーザー情報) | TTL (残り時間)
-------------------+------------------------------+--------------
sess:101 | {"user_id": 1, "name": "山田"} | 3580秒
sess:102 | {"user_id": 2, "name": "佐藤"} | 1180秒
sess:104 | {"user_id": 4, "name": "田中"} | 3600秒
5. Redisはキャッシュやジョブ管理にも使われる
セッション管理以外にも、Redisには重要な役割があります。
キャッシュとしての利用
キャッシュとは、一度計算した結果や、データベースから持ってきた重いデータを一時的に保存しておく仕組みです。 例えば、人気商品のランキングページなど、誰が見ても同じで、かつ作るのに時間がかかるデータは、Redisに保存(キャッシュ)しておき、2回目以降はそこからサッと取り出すことで表示を速くします。
/* ランキングデータをキャッシュとして保存 */
SET ranking_cache "1位:リンゴ, 2位:バナナ, 3位:ミカン" EX 300;
ジョブキュー(後回し仕事)の管理
ジョブキューとは、「後でやっておいてね」という仕事を溜めておく場所です。 例えば、会員登録後の「確認メール送信」などは、送信完了を待っていると画面がなかなか切り替わりません。 そこで、「メールを送る」という仕事(ジョブ)をRedisに放り込んでおき、裏側で別のプログラムがそれを処理することで、ユーザーには即座に「登録完了!」の画面を見せることができます。
/* メールの送信予約をリストに追加 */
LPUSH email_jobs "send_to:tanaka@example.com";
LPUSH email_jobs "send_to:sato@example.com";
Queue (待ち行列) | 内容
-------------------+-------------------------------
1番目 | send_to:sato@example.com
2番目 | send_to:tanaka@example.com
6. Redisを使うときの注意点
夢のようなRedisですが、初心者が知っておくべき弱点もあります。それは、「データが消える可能性がある」ということです。 Redisはメモリ上にデータを置くため、サーバーの電源が急に落ちるとデータが消えてしまいます。そのため、銀行口座の残高のような絶対に消えてはいけない大切なデータは、Redisではなく、従来のようなしっかりとしたデータベース(MySQLやPostgreSQLなど)に保存するのが鉄則です。
「消えても最悪ログインし直せばいい」セッション情報や、「また作り直せる」キャッシュデータこそが、Redisの得意分野なのです。