PostgreSQL 缓存选择指南

“添加缓存”可能意味着多种不同改动。PostgreSQL 页缓存、预备 SQL、整行缓存、物化视图和 Redis 分别避免不同的读取工作。先识别请求中重复执行的工作,再使用基准测试指南测量完整路径。

从重复工作开始

需求 优先考虑 改变了什么
保持表页与索引页为热数据 PostgreSQL shared_buffers 和操作系统缓存 减少存储读取;SQL 仍需执行
多次发送相同语句 预备语句 减少重复解析与规划;仍需执行
按主键返回完整行 pg_local_cache SQL mget 通过显式 API 复用符合条件的整行载荷
预计算连接或聚合 物化视图 读取持久化结果;刷新决定新鲜度
跨服务共享应用对象 Redis 等外部缓存 应用管理键、TTL 和失效

页与预备 SQL

shared_buffers 保存数据库页,而不是最终 SELECT 结果。热页可以避免存储 I/O,但 PostgreSQL 仍然要规划或执行查询、检查可见性并构造结果。预备语句可在同一会话内避免重复解析与分析,但仍基于当前数据库状态执行,计划可能是通用计划或定制计划。

行缓存比较展示各路径仍需完成的工作。

按主键缓存整行

pg_local_cache 在有界 PostgreSQL 共享内存中,按完整主键存储序列化的完整行。通过 local_cache.mget('public.items'::regclass, $1::bigint[]) 访问;普通 SELECT 从不查询此缓存。未写入映射数据且符合条件的 READ COMMITTED 读取可以命中,而更严格的隔离级别、事务中的写入、恢复、并行执行或超大行会使用 PostgreSQL。在关联期间,不支持的表映射会被拒绝。这是一条特定读取路径,不是任意查询结果缓存。参阅批量查找指南技术约定事务检查

视图与外部缓存

PostgreSQL 物化视图将查询结果持久化为关系,并按需刷新。适用于重复报表、聚合与连接,前提是刷新计划提供的新鲜度边界可以接受。它不能逐键替代行缓存。

Redis 等外部缓存适用于多进程或多服务共享的应用对象。应用负责键、序列化、TTL 和失效。参阅 Redis cache-aside 指南快速开始会在 public.items 上运行 pg_local_cache

更新于 .