世界を動かす技術を、日本語で。

メモキャッシュの賛美

2026年6月23日原文(jchri.st)

概要

  • インフラ管理者が キャッシュ導入 を求められる場面の多さ
  • Redisが キャッシュからデータベース扱い へ変わるリスク
  • memcachedの シンプルな設計と運用性 の強み
  • Redisとmemcachedの 運用上の違い の明確化
  • 適切な クエリ最適化 の重要性

Redisをキャッシュとして導入する際の注意点

  • インフラ管理者やsysadminが キャッシュ導入 を求められる機会の多発
  • Redisは 高機能で信頼性の高いキャッシュ として広く利用
  • キャッシュ用途 で導入したはずが、次第に 永続的なデータストア として扱われる傾向
  • Redisの persistence機能 自体は存在するが、初期導入時は 揮発性前提 で運用されがち
  • アプリケーションが Redisに依存 し始めると、切り離しや再設計が困難
  • Redisの運用が 「ペットのような」永続的管理 へと変化

memcachedの特徴とRedisとの比較

  • memcachedは シンプルな分散メモリキャッシュ であり、 永続化機能なし
  • 無料・オープンソース で高性能、導入・運用が容易
  • Djangoなどの プラガブルなキャッシュフレームワーク で簡単に切り替え可能
  • 障害時の対応 が非常にシンプル
    • クライアントライブラリが接続例外を無視し、get時はデフォルト値(Noneなど)を返却
  • memcachedの クラスタリング はクライアント側で実現
    • 複数URLを設定し、キーのハッシュで自動的にインスタンスを選択
    • 障害発生時は自動的に該当ノードを除外、一定時間後に再接続を試行
  • 永続化しない 設計なので、 完全なステートレス運用 が可能
  • 小規模・軽量なインスタンス を多数並行稼働でき、運用負荷が極小
  • Redisでも同様の構成は可能だが、memcachedの方が 運用設計に特化 しているためシンプル

キャッシュ運用のベストプラクティス

  • キャッシュは永続的なデータストアではない という認識の徹底
  • memcachedのような シンプルなキャッシュ の活用
  • クエリ最適化やインデックス設計 による根本的なパフォーマンス改善の推進
  • サービスディスカバリ を利用した自動設定生成の推奨
  • memcached開発者ブログなどの 技術情報の参照 による知見拡充

まとめ

  • Redisは高機能だが、運用設計を誤ると「データベース化」しやすい 傾向
  • memcachedはキャッシュ用途に特化し、運用・障害対応が極めて容易
  • 用途と運用方針 を明確化し、適切なキャッシュ技術を選択することが重要

Hackerたちの意見

10年前にmemcachedをやめてRedisに切り替えたけど、今はvalkeyを使ってる。レガシーな依存関係が必要な時以外は、memcachedに戻る必要を感じたことはないな。

うん、記事の主張についてどう思う?

著者が言ってたRedis/Valkeyの問題は、実際に生産環境で見たことがあるよ。* Valkeyがメモリポリシーなしでメモリを食い尽くして、append-onlyファイルに書き込みエラーを引き起こしたアウトage。ディスクが満杯でAOFの書き込みが失敗したケースもあった。* Redisが常に稼働していて、全ユーザーのデータが入っていることが期待されているのに、500エラーが出たことも。* ソート済みセットや他のデータ構造を使ったクリエイティブな利用法も、セットが追い出されないことに依存してた。現場の観察を踏まえても、memcacheをRedisより推奨するのは難しいと思う。memcacheに優しいキャッシュレイアウトを持つアプリを設計するのは難しいし、memcacheを使う大きなチームはほぼ確実にRedisが必要になると思う。それで、2つのキャッシュ技術を維持することになるんだよね。

2つのキャッシュ技術を維持しない方が絶対にいいよね。

誰かがRedisをキャッシュ以外の用途で使いたいと決めたら、結局2つのキャッシュ技術を持つことになるよね。キャッシュ用に設定されたRedisインスタンスは他の目的には使えないし(キャッシュインスタンスはエビクションが必要、非キャッシュインスタンスはエビクションがない必要がある)。異なる設定の2つ目のRedisが必要になる。正直、アプリを「memcacheフレンドリーなキャッシュレイアウト」に設計するのは、Redisフレンドリーなキャッシュレイアウトに設計するのと同じことだよ。この種のアプリケーションキャッシュのパターンは同じで、「取得して、なければ計算して設定する」って感じ。

memcachedは好きだけど、ボラタイルキャッシュとして設定しておいて、みんながそれを永続的なデータストアとして扱うのは本当にRedisのせいじゃないよね。比較が変なのは、memcachedも永続的じゃないから。

多くの会社(ほとんどと言ってもいいかも)では、Redisは実際の耐久性のあるプロダクションデータベースとして見られていて、いつでも消えるキャッシュとして扱われてるわけじゃない。新しい開発者がそう思うのも無理はないよ。

過去数年でFlaskの仕事をたくさんやったけど、フルタイムじゃなくて小さなeコマースビジネスの技術スタックの一部としてね。MongoEngine、SQLAlchemy、Celery(マジで、精神を大事にするならCeleryは使わない方がいい!)やGoogle、eBay、ShopifyのPythonスタックでいろんなトラブルに遭遇したけど、Redisには出会ったことがない。たぶん、Redisを永続ストレージだと思ってるランダムな人に管理者アクセスを与えてないからかも。でも正直、Redisは本当に堅牢でよく設計された技術だと思う。APIは基本的なもので、ちょっと変わったことをする必要がある時も、理にかなった考え抜かれた方法があるんだよね。

今、Flask、SQLAlchemy、Celeryを使ったプロジェクトを始めようとしてるんだけど、Celeryを避けるべき理由と代わりに何を使えばいいか、もっと教えてほしいな。

ちょっと変わったことをしなきゃいけないとき、ちゃんとした考えられた方法があるんだ。私の世界では、memcachedやredisのようなキャッシュシステムは、ただのキャッシュとして使うものだよ。タグ付けのような無効化システムを使うこともあるかも。キャッシュシステムで「変わった」ことって何ができるの?データをキャッシュする以外に、みんなはキャッシュをどう使ってるの?本当に興味があるんだ。

memcacheのもう一つの特徴であまり言われないのは、すべての操作がO(1)で設計されていること。これは著者たちの意識的なデザイン選択で、制限があるけど、シンプルな操作でランダムなスタールがないことを保証してる。一方で、Redisはシングルスレッドのコアデザインだから、任意の複雑さの操作を実行できるけど、それが終わるまで他のすべてが待たされることになるんだよね。

こういうことはオープンソースプロジェクトや長期にわたって維持されるプログラムでよく起こるよね。コードベースが大きくなるにつれて、元々の計画にはなかったことをサポートし始めるのは避けられない。機能が増えるとユーザーも増えるし、古いものにこだわる人もいれば、新しいものを受け入れる人もいる。最終的には特定の価値観がデファクトスタンダードになって、もはや選択肢じゃなくなる。Redisを例に挙げると、AOFをオフにすれば揮発性のメモリキャッシュとして機能するけど、ほとんどの人はそんな風には考えないよね。だから、機能が少なくてシンプルな方がいいっていう意見もある。(この文脈ではMemcachedがその例)いわゆる「ストレートジャケット」アプローチ。大きなチームには理にかなってるけど、一方でオープンソースプロジェクトは資金や貢献を得るために定期的なアップデートが必要だから、そこに緊張感が生まれるんだよね。時には特定のニッチな分野で優れた専門的なフォークやスピンオフが生まれることもある。私の個人的な意見?正解はないよ。すべてはコンテキスト次第。結局、コミュニケーション自体はタダじゃないからね。

Hacker Newsで議論の続きを見る