コンテンツにスキップ

【比較】RedisとMemcachedの違い

概要

Redis と Memcached は、どちらも RAM 上にデータを保持する高速な インメモリのキーバリューストアで、データベース負荷の軽減や高速なデータアクセスのために使われます。ここまでは共通ですが、設計思想と機能の幅は大きく異なります。

Memcached は「分散メモリオブジェクトキャッシュ」を目的としたシンプルなツールで、メモリをスラブクラス(一定サイズのチャンク群)に分割するスラブアロケータで管理し、各ワーカースレッドが自前のイベントループでクライアントを捌くマルチスレッド設計です。データは原則として揮発性(永続化しない一時キャッシュ)です。一方の Redis は、文字列・ハッシュ・リスト・セット・ソート済みセット・ストリームなど豊富なデータ構造を扱える「インメモリデータプラットフォーム」で、永続化(RDB / AOF)、レプリケーション、Pub/Sub、Lua スクリプティングなどを備えます。コマンド実行は「ほぼシングルスレッド(mostly single-threaded)」で、永続化などの遅い I/O はバックグラウンドスレッドへ逃がします。

詳細比較

比較軸 Redis Memcached
位置づけ 多機能インメモリデータプラットフォーム シンプルな分散メモリキャッシュ
データ型 文字列/ハッシュ/リスト/セット/ソート済セット/ストリーム 等 単純なキーと値(バイト列)中心
永続化 あり(RDB スナップショット / AOF) なし(原則揮発性の一時キャッシュ)
レプリケーション あり(マスター/レプリカ) コア機能としては持たない
Pub/Sub・スクリプト Pub/Sub・Lua スクリプティング対応 なし(キャッシュ操作に特化)
スレッドモデル コマンド実行はほぼシングルスレッド(+背景 I/O スレッド) マルチスレッド(ワーカースレッド+libevent)
メモリ管理 データ構造ごとの管理 スラブアロケータ(スラブクラス/チャンク)
主用途 キャッシュに加えメッセージング・ランキング・セッション等 単純なキャッシュでの DB 負荷軽減

補足:Redis の「シングルスレッド」はコマンド実行の話で、BGSAVE/AOF などの遅い I/O は背景スレッドが担う。Memcached のマルチスレッドは「複数ワーカーで接続を捌く」設計を指す。

よくある誤解

  • 誤解1:「Redis は Memcached を単純に高速化したもの(上位互換の速いキャッシュ)」 — 違います。両者は設計思想が異なります。Memcached はシンプルな揮発性キャッシュに特化したマルチスレッド設計、Redis は豊富なデータ構造・永続化・レプリケーション・Pub/Sub を備えるデータプラットフォームです。速度は用途・データサイズ・並行度・設定に依存し、「Redis が常に速い」と一般化できるものではありません。
  • 誤解2:「Redis はシングルスレッドだから遅い/CPU を使い切れず必ず不利」 — 短絡的です。Redis はコマンド実行をほぼシングルスレッドで逐次処理しますが、これにより操作がアトミックで挙動が予測しやすく、多重化(multiplexing)で多数接続を捌けます。遅い I/O は背景スレッドへ逃がします。スレッド数の多寡だけで優劣は決まりません。
  • 誤解3:「Memcached はシングルスレッド」 — 逆です。Memcached は各ワーカースレッドが自前のイベントループでクライアントを処理するマルチスレッド設計で、libevent により多数の接続にスケールします。「シングルスレッドなのは(コマンド実行の)Redis 側」という整理が正確です。
  • 誤解4:「Memcached でもデータは永続化される/再起動しても残る」 — 残りません。Memcached は原則揮発性の一時キャッシュで、再起動やプロセス終了で内容は失われます。永続化やレプリケーションが要件なら Redis(RDB/AOF)を検討します。

実務での選び分け

「どちらが新しいか」ではなく「必要な機能と運用要件」で選びます。

  • 単純なキー=値のキャッシュで DB 負荷を下げたいだけ/構成をできるだけ単純に保ちたい → Memcached。
  • データ構造(ランキング=ソート済セット、キュー=リスト、セッション=ハッシュ)やアトミック操作が欲しい → Redis。
  • 永続化・レプリケーション・Pub/Sub・サーバサイドスクリプトが要件 → Redis。
  • 多コアでの接続スループットを単純キャッシュ用途で最大化したい → Memcached(マルチスレッドが効きやすい)。
  • 判断軸:①必要なデータモデルの複雑さ ②永続化/レプリケーションの要否 ③メッセージングなど付加機能 ④運用のシンプルさ。性能は最終的に自分のワークロードで計測して判断する。

ひとことまとめ

RedisとMemcachedはどちらも高速なインメモリ KV ストア。Memcached=シンプルな揮発性キャッシュでマルチスレッド/スラブ管理、Redis=豊富なデータ構造・永続化・レプリケーション・Pub/Sub を備え、コマンド実行はほぼシングルスレッド。「Redis は速い Memcached」ではなく、目的の異なるツールとして選び分けます。

出典・参考

  • Redis 公式ドキュメント「Get started」(versatile な in-memory データプラットフォーム。文字列/ハッシュ/リスト/セット/ソート済セット/ストリームなどのデータ構造、永続化・レプリケーション・Pub/Sub・スクリプト、キャッシュ/DB/メッセージブローカー等の用途): https://redis.io/docs/latest/develop/get-started/
  • Redis 公式ドキュメント「Diagnosing latency issues」(Redis は mostly single threaded 設計。多重化で全クライアント要求を単一プロセスで逐次処理。2.4 以降、遅いディスク I/O は背景スレッドで実行するが要求処理自体は単一スレッド): https://redis.io/docs/latest/operate/oss_and_stack/management/optimization/latency/
  • Memcached 公式サイト「About」(汎用の高性能分散メモリオブジェクトキャッシュ。動的 Web アプリの DB 負荷軽減のための短期メモリ=一時キャッシュであり恒久的な永続化を意図しない): https://memcached.org/about
  • Memcached 公式 Wiki「UserInternals」(メモリは既定 1MB ページに分割しスラブクラスへ割り当てるスラブアロケータ。各ワーカースレッドが自前のイベントループでクライアントを処理し、libevent で多数接続にスケール=マルチスレッド): https://github.com/memcached/memcached/wiki/UserInternals