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

Redisは高速です – Postgresにキャッシュします

2025年9月26日原文(dizzy.zone)

概要

  • RedisとPostgresをキャッシュ用途で比較した検証結果のまとめ
  • Kubernetesクラスタ上で、CPUやメモリを制限した環境でベンチマークを実施
  • Redisの方が一貫して高いパフォーマンスと低レイテンシを示した
  • Postgresの「UNLOGGED TABLE」利用による効果も確認
  • プロジェクトの要件次第でPostgresをキャッシュとして使う選択肢も有効

Redis vs Postgresでキャッシュを検証

  • PostgresをRedisの代わりにキャッシュ用途で使う是非を検証テーマ
  • RedisとPostgres(UNLOGGED TABLE利用)を比較するため、シンプルなHTTPサーバをGoで実装
  • APIサーバ、キャッシュ(Redis/Postgres)、ベンチマーク(k6)をKubernetesクラスタの異なるノードで稼働
  • 各キャッシュに3,000万件のデータを投入し、既存/新規キーの割合を調整しつつベンチマーク実施
  • 計測項目はリクエスト毎秒(RPS)、レイテンシ、CPU・メモリ使用量

Redisのキャッシュ実装

  • github.com/redis/go-redis/v9 ライブラリ利用
  • Get/Set メソッドを実装し、Redisサーバとやり取り
  • Redisサーバはデフォルト設定で起動

Postgresのキャッシュ実装

  • github.com/jackc/pgx/v5 ライブラリ利用
  • UNLOGGED TABLE を使い、WAL(Write Ahead Log)を無効化し書き込み高速化
  • Get/Set メソッドを実装し、Postgresサーバとやり取り
  • プール設定で接続数を調整

ベンチマーク条件

  • 2CPU・8GiBメモリに制限したノード上でRedisまたはPostgresを稼働
  • APIサーバとベンチマークPodも別ノードで稼働
  • 2分間のGET/SET/混合ワークロードをそれぞれ実施
  • GETは80%既存キー、SETは10%既存キーを更新
  • 混合はGET:SET=8:2の割合

ベンチマーク結果

GETリクエスト性能

  • RedisがPostgresより高いRPSを記録
    • RedisはCPU使用率~1280mCPU、メモリ~3800MiBで安定稼働
    • PostgresはCPU2コアを常にフル活用、メモリ~5000MiB
  • レイテンシもRedisが優秀

SETリクエスト性能

  • RedisがPostgresより高いRPSを維持
    • Redisは新規キー追加でメモリ~4300MiBに増加
    • Postgresは書き込み時もCPUボトルネック、メモリ~5500MiB
  • レイテンシもRedisが優位

混合ワークロード

  • Redisが一貫して高性能
    • RedisはCPU~1280mCPU、メモリも適度に増加
    • Postgresは2コアを常時フル活用、メモリ~6GiB
  • レイテンシもRedisが勝る

UNLOGGED TABLEの効果

  • 書き込み系ベンチマークで大きな差
    • UNLOGGED TABLEはWALをスキップするため、書き込みが高速化
    • 読み取り性能には大きな差は見られず

結論と考察

  • Redisはキャッシュ用途で圧倒的に高速

    • TTLや豊富なキャッシュ機能も標準搭載
  • Postgresをキャッシュとして使う理由も存在

    • 追加ミドルウェア不要、依存性削減
    • キーの有効期限管理はカラム追加+定期削除で代替可能
    • 1秒あたり7425リクエスト(1日5億リクエスト超)でも十分運用可能
    • プロジェクト規模や要件によってはPostgresだけで完結も現実的
  • キャッシュ層のインターフェース設計推奨

    • 将来的なストアの切り替えが容易
  • Redisがベストだが、Postgres単体運用も十分選択肢

    • 規模や要件、運用コストを考慮した柔軟な設計が重要

Hackerたちの意見

同じような感じで、Redka(https://github.com/nalgeon/redka)は、SQLiteかPostgresでサポートされたRedis APIの一部にアクセスできるから、いいアイデアだと思ってた。

これを投稿しに来た。RedkaのパフォーマンスがPostgres(とRedis)と比べてどうなるのか気になるな。編集: https://antonz.org/redka/#performance

キャッシュキーにTTLを設定できる機能は、キャッシュの重要な特徴で、後から追加できるものじゃないよね。「Redisを使うな」っていう投稿はいつも変に感じる。Redisはどんな規模でも簡単に操作できるから、なんでそれを排除することが重要なのかよくわからない。

そうそう、記事では「どうせDBは必要だし」って言ってるけど、キーの期限切れのために余計なcronジョブを設定して、さらにコードも増やしてる。YAGNIや依存関係を避けるのはわかるけど、これは本当に余計な手間だよね。Postgresにもキャッシュ機能があればいいのに。そうなるまでは、再発明するよりもRedisかmemcachedを使うつもり。

悪いわけじゃないけど、運用するシステムの数を減らすって感じかな。

いつかPostgresがタイムスタンプ列を期限切れ列としてマークできるようになることを期待してる。キャッシュ以外にも、セッショントークンやフィーチャーフラグ、バックグラウンドジョブ、レート制限、遅延削除(ソフト削除のバリエーション)など、いろんなことに役立つと思う。自動バキュームが定期的に期限切れの行を処理できるみたいだし、クエリプランナーが自動的に期限切れの行を除外する条件を追加して、期限切れの行が自動バキュームでクリーンアップされるまで見えないようにできるんじゃないかな。

キャッシュキーにTTLを設定できる機能は、キャッシュにとって重要な要素だよね。後から追加できるものじゃない。具体的にどんな課題があるの?少なくとも、DBエントリの一部として有効期限のタイムスタンプを保存することはできるよ。一般的なキャッシング戦略では、キャッシュが期限切れになる前に再検証することが含まれているし、再検証中に古いデータを返すのは全く珍しいことじゃないから。

なんでこんなにグラフがきれいでよく書かれた記事を推すのか、実際のベンチマークスタディとしては「F」評価に値するのに。こういう風に提示されると、カジュアルな読者はPostgresがRedisの2/3のパフォーマンスだと思っちゃうよ。まじで。彼はPostgresが2コアをフルに使ってるのを認めてるけど、RedisはHTTPサーバーにボトルネックがあったって言ってる。ベンチマークにはもっとアカデミックな文化が必要だよ、ハッカー文化じゃなくて。

これが僕のブログに載ってる理由があるんだ。これはどちらのツールの絶対的な速度を示すものじゃないし、ベンチマークもそのために設定されてない。ブログ記事ではRedisがもっとパフォーマンスを発揮できるって言ってるよ。

ブログやってる人の大半は、自分が何やってるか分かってないか、知ろうともしてないんだよね。悲しいことに、そういう人が会社に雇われて、ブログがあるからみんなその言うことを聞く。あの業界では本当にひどいことを見てきたよ。何人かは本当に詐欺師みたいなもんだ。

彼はPostgresが2コアをフルに使っていることを認めているけど、RedisはHTTPサーバーによってボトルネックになっているんだね。あなたの言いたいことは何なの?どちらかをさらに最適化できるってこと?まあ、そうだろうね。それは驚くべきことじゃないよ。レイテンシーだけでも、いくつかの横断的リクエストの範囲に入ってるし。RedisがPostgresよりも優れていることに驚いた?そんなことないと思うけど。じゃあ、問題は何なの?証明されている主なポイントは、パフォーマンスに関しては確かに収穫逓減があるってことだよ。キャッシュにアクセスする際に20msの余裕があるアプリケーションなら、永続データベースを使ったキャッシングも選択肢だよ。そういう事実に驚く人もいるみたいだけど、それは考える材料になるよね。

あなたの言いたいことが分からない。この結果は、すべてのパラメータが文書化されているから、Fはつかないよ。結論も間違ってないし、じゃあ問題は何なの?

Hacker Newsで議論の続きを見る