Redisとは?インメモリDBの仕組み・使い方・Memcachedとの違い

Redisとは? ― 超高速インメモリデータストアの定番

Redis(Remote Dictionary Server)とは、データをメモリ上に保持することで、ミリ秒未満の応答速度を実現するオープンソースのインメモリデータストアです。単純なキーバリュー型のデータだけでなく、リスト・セット・ハッシュ・ソート済みセットなど豊富なデータ構造をサポートしており、キャッシュ・セッションストア・メッセージブローカー・リアルタイムランキングなど幅広い用途で活用されています。

図書館で例えると、通常のデータベースは「書庫にある本を探して持ってくる」作業です。Redisは「よく読まれる本をカウンターの上に並べておく」仕組みです。必要な本にすぐ手が届くため圧倒的に速いですが、カウンターのスペース(メモリ)には限りがあります。

Redisが高速な理由 ― メモリとシングルスレッドの秘密

インメモリ処理:Redisはすべてのデータをメモリ(RAM)上に保持します。ディスクI/Oが発生しないため、読み書きともにマイクロ秒〜ミリ秒単位の応答が可能です。一般的なRDB(MySQL、PostgreSQLなど)と比較して、100倍〜1000倍の速度差があるケースも珍しくありません。

シングルスレッド・イベントループ:Redisはコア処理をシングルスレッドで実行します。これにより、ロック競合やコンテキストスイッチのオーバーヘッドが発生しません。「シングルスレッドだと遅いのでは?」と思われがちですが、ボトルネックはCPUではなくネットワークI/Oであるため、実際には1秒間に10万〜数十万の操作を処理できます。

Redisのデータ構造 ― 単なるキャッシュではない

データ構造 説明 主なユースケース
String 最もシンプルなキーバリュー。最大512MB キャッシュ、カウンター、セッション管理
List 順序付きの文字列リスト。先頭・末尾への追加が O(1) メッセージキュー、タイムライン
Set 重複のない文字列の集合 タグ管理、ユニークユーザー数の集計
Sorted Set スコア付きのSet。スコア順に自動ソート リアルタイムランキング、優先度付きキュー
Hash フィールドと値のペアを持つ構造 ユーザープロフィール、設定情報の格納
Stream 追記専用のログ構造。コンシューマーグループ対応 イベントストリーミング、ログ集約

Redisの永続化 ― メモリだけでは不安?

「メモリ上のデータはサーバーが落ちたら消えるのでは?」という懸念に対して、Redisは2つの永続化方式を提供します。

RDB(スナップショット):一定間隔でメモリ上のデータ全体をディスクに保存します。復旧が高速ですが、最後のスナップショット以降のデータは失われます。

AOF(Append Only File):すべての書き込み操作をログとしてディスクに追記します。データの欠損が最小限(設定次第で1秒以内)ですが、ファイルサイズが大きくなり、復旧に時間がかかります。

両方を併用することも可能で、本番環境ではRDB + AOFの併用が推奨されています。

RedisとMemcachedの違い

比較項目 Redis Memcached
データ構造 豊富(String、List、Set、Hash、Sorted Setなど) String(キーバリュー)のみ
永続化 RDB / AOFで永続化可能 なし(純粋なキャッシュ)
レプリケーション マスター・レプリカ構成をサポート サポートなし
クラスタリング Redis Clusterで自動シャーディング クライアント側でシャーディング
メモリ効率 データ構造のオーバーヘッドあり シンプルなため効率が高い
スレッドモデル シングルスレッド(I/OはRedis 6+でマルチスレッド) マルチスレッド

結論として、単純なキャッシュだけならMemcachedも選択肢ですが、ランキング・セッション管理・Pub/Subなど多機能が必要な場合はRedisが適しています。現在の新規プロジェクトではRedisが第一選択となるケースが多いです。

Redisの代表的なユースケース

キャッシュ層:RDBの前段にRedisを配置し、頻繁にアクセスされるデータをキャッシュします。データベースへの負荷を劇的に削減できます。

セッションストア:WebアプリケーションのセッションデータをRedisに保存することで、複数サーバー間でセッションを共有し、サーバーの再起動でもセッションが失われません。

リアルタイムランキング:Sorted Setを使えば、スコアの更新と順位の取得がともにO(log N)で実行でき、大規模ゲームのランキングなどで活用されています。

レート制限:APIの呼び出し回数制限をRedisのカウンターとTTL(有効期限)で実装できます。

よくある質問(FAQ)

Q. Redisはデータベースの代わりになりますか?
A. 限定的なケースでは可能ですが、一般的にはRDB/NoSQLの補完として使うのが適切です。Redisのメモリコストはディスクストレージより高く、複雑なクエリやJOIN操作には対応していません。

Q. Redisのメモリが不足したらどうなりますか?
A. maxmemory設定とエビクションポリシー(LRU、LFUなど)で、メモリ上限に達した際の動作を制御できます。古いデータを自動的に削除する設定が一般的です。

Q. クラウドでRedisを使うには?
A. AWS ElastiCache for Redis、Google Cloud Memorystore、Azure Cache for Redisなど、各クラウドがマネージドサービスを提供しています。運用の手間を大幅に削減できます。

まとめ

Redisは、インメモリの高速性と豊富なデータ構造を兼ね備えた万能なデータストアです。キャッシュだけでなく、セッション管理・ランキング・メッセージング・レート制限など、多彩なユースケースに対応します。永続化やクラスタリングの機能も充実しており、小規模な開発から大規模なプロダクション環境まで幅広く採用されています。

コメント