97. MemcachedとValkey/Redisは速さの出し方が違う — マルチスレッドの単純KVとシングルスレッドのデータ構造サーバー
ElastiCacheがなぜ2系統のエンジンを提供するのか、「同じインメモリkey-valueストア」に見える2つが実は正反対の設計思想でできていることを、公式の選択基準と2つの証拠(リーダーボードとpub/sub)を図で追っていきます。
① 表面は同じ、中身は違う
- 公式原文「On the surface, the engines look similar. Each of them is an in-memory key-value store. However, in practice there are significant differences.」
- Memcachedのデータ型は "Simple"、注記では「string, objects (like databases)」。Valkey/Redisは "Complex"、注記(3.2.x以降)では「string, sets, sorted sets, lists, hashes, bitmaps, hyperloglog, geospatial indexes」(2.8.x向け旧注記にgeospatialは含まれないが、現在サポートされるのは4.0.10以降のみ)
- 「submillisecond」はuse-casesページ冒頭「ultrafast (submillisecond latency) … access to copies of data」より
どちらもkey-valueという入口は同じでも、Memcachedは「値=単純な塊」を出し入れするだけの店、Valkey/Redisは「値そのものが操作できる構造(集合・順序付き集合・ハッシュ…)」を持つ店。この一点がこのあとの全ての違いを生む。
② 公式の選択基準 — 仕事の形で決まる
- Memcached側は公式4項目そのまま:「the simplest model possible」「run large nodes with multiple cores or threads」「scale out and in, adding and removing nodes」「cache objects」(SelectEngine.html「Choose Memcached」の箇条書き)
- Valkey/Redis側の4項目は、現行ドキュメントでは箇条書きではなく比較表(Comparison summary)からの再構成: Data types=Complex、High availability (replication)=Yes、Automatic failover=Optional/Required、Pub/Sub=Yes、Backup and restore=Yes がいずれもValkey/Redis側のみ。現行の「Choose Valkey or Redis OSS」箇条書き自体はバージョン別機能(9.0/8.2/8.1/8.0/7.2/6.2/6.0)の列挙になっている
公式の分かれ道は「シンプルさ・多コアの大ノード・ノード数での伸縮」を求めるならMemcached、「豊かなデータ型・高可用性・pub/sub・バックアップ」を求めるならValkey/Redis。求める道具の数がそのまま選択を決める。
③ 比較表を1行ずつ — マルチスレッドだけがMemcachedの独壇場
- Multi-threaded は Memcached だけ Yes、Valkey/Redis は両モードとも No(=シングルスレッド設計)
- Automatic failover は cluster mode disabled で "Optional"、enabled で "Required"
- バックアップ/リストアの No* は node-based クラスタの話。原文「For serverless caches only, not applicable to node-based clusters」— Memcachedのnode-basedクラスタでは非対応
- データ分割: Memcached=Yes、Valkey/Redis(cluster mode disabled)=No、(cluster mode enabled)=Yes
表を縦に読むと構図が見える。Memcachedが唯一勝つのは「マルチスレッド」、Valkey/Redisが独占するのは「レプリケーション・自動フェイルオーバー・pub/sub・sorted sets・バックアップ」。そしてValkey/Redisはシングルスレッド——この1点が、次のレッスンで見る『重いコマンド1つが全体を止める』話の伏線になる。
④ シングルスレッドはなぜ「弱み」でなく「設計」か
- Multi-threaded: Memcached=Yes / Valkey・Redis=No(比較表)
- シングルスレッドが「なぜ速いか」を公式が直接論じてはいない。比較表の Multi-threaded=No が事実で、ロック不要・順序保証という一般論はCS基礎の解説(公式挙動=sorted setsが挿入のたびに再ランクし順序を保証、と整合)
- Lambda編・コンテナ編で見た「スレッドを増やして並列にさばく」がMemcached側。その対極が、シングルスレッド+イベントループで「ロックなしに順序を保証する」Valkey/Redis側。同じ製品カテゴリの中に、CS基礎の並行処理の2大設計が並んで実装されている
シングルスレッドは性能の欠陥ではなく選択。1本で回すからロックが要らず、コマンドの実行順序が保証される。その代わり、時間計算量の重いコマンド1つが全体を止める——強みと弱みは同じ設計の裏表。
⑤ 証拠その1:リーダーボード — 計算をアプリからキャッシュへ移す
- 公式原文「With Valkey or Redis OSS sorted sets you can move the computational complexity of leaderboards from your application to your cluster.」
- 「each time a new element is added to the sorted set it's reranked in real time」— 挿入のたびに再ランク。コマンドと出力は公式の例をそのまま。ZREVRANK は 0始まり(zero-based)なので2位=1
- Sorted sets は Valkey/Redis のみ Yes(Memcached=No)
- DynamoDB編の「クエリに合わせてデータを形作る」思想と同じ。アプリが毎回計算する代わりに、データ構造(sorted set)そのものに順序を持たせ、計算の複雑さをキャッシュ側へ移す。Memcachedの「単純な塊」ではこれはできない
sorted setsは「値が操作できる構造」の代表例。挿入のたびにリアルタイムで並べ替えるので、アプリは順位計算を持たなくていい。これが「データ構造サーバー」であることの証拠その1。
⑥ 証拠その2:pub/sub — チャネルに発行し、購読者だけが受け取る
- 公式原文「you send a message to a specific channel not knowing who, if anyone, receives it. The people who get the message are those who are subscribed to the channel.」
- SUBSCRIBE(単一/複数)、PSUBSCRIBE(パターン)、PUBLISH(発行)は公式コマンド例。「Pub/sub functionality has no relation to any key space」— key空間とは独立
- 公式の制約: クライアントは自分が購読中のチャネルへはPUBLISHできない(「A client can't publish to a channel that it is subscribed to.」)
- PSUBSCRIBE/PUNSUBSCRIBE は ElastiCache Serverless では非対応。Sharded Pub/Sub は Valkey 7.2 / Redis OSS 7.0(Enhanced)以降で利用可。Pub/Sub は Valkey/Redis のみ Yes(Memcached=No)
- メッセージング編で見たSNSファンアウト(1つの発行を複数の購読者へ)の原理の再登場。ただし今度は独立したメッセージブローカーではなく、キャッシュエンジンの中に同じpub/subが入っている。発行者と購読者が互いを知らずに疎結合になる構図は同じ
pub/subは発行者と購読者を切り離す。発行者はチャネルに投げるだけ、受け取るのは購読者だけ——同報配信の原理がキャッシュの中に組み込まれている。これが「データ構造サーバー」であることの証拠その2。Memcachedにはこの機能はない。
⑦ 締め:Valkeyへ新機能が載っていく流れ、そして結論
- ValkeyがRedis OSSからフォークされたオープンソースであることは、この2ページには明記がない(AWSの他の公式発表・ドキュメントで周知)
- バージョン別機能: memory efficiencies=Valkey 8.0+(embedded keysで最大20%改善)、Bloom filters=Valkey 8.1+(メモリ効率ハッシュテーブルはオーバーヘッド最大20%削減)、Vector search=Valkey 8.2+(microsecond latency・95%+ recall)、Full-text/Hybrid search/Aggregation=Valkey 9.0+
- Durability(Multi-AZ transactional log)=Valkey 9.0+かつcluster mode enabledのみ(sync/async選択可、原文「zero data loss during failures」)。use-cases側の補強:「durabilityを有効にしsynchronous writesを選べば、データ損失が許されない用途(RAG知識ベース・AIエージェントメモリ・決済トークン化・リアルタイム在庫等)にも使える」
- バージョンごとの機能対応は現行ドキュメントで確認済み(2026-07時点、ElastiCache for Valkey 9.0 が最新記載)。将来変わりうる
新機能(ベクトル検索・Bloomフィルタ・メモリ効率化・Multi-AZトランザクションログによるdurability)はValkey側に積み上がっていく。結論——「単純な仕事を並列にさばく」か「豊かな道具を一列で正確に回す」か。どちらが速いかは仕事の形が決める。2エンジンが併存する理由はここにある。