概要
- 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単体運用も十分選択肢
- 規模や要件、運用コストを考慮した柔軟な設計が重要