PostgreSQL
内部缓存行数据。

通过 SQL mget 或 RESP 按主键读取行。PostgreSQL 写入会自动使受影响的缓存项失效。

显式 SQL API · PostgreSQL 14–18 · 开源

本地测量 · 2026 年 9 月 15 日

839,678请求/秒 · RESP MGET

3.31× 预备 SQL 的吞吐量
仅针对本次单键比较

预备 SQL
253,790 请求/秒
SQL mget
186,296 请求/秒
Apple M3 Max · PostgreSQL 16 · Go · 256 个连接。
热缓存,每请求 1 个键。3 × 5 秒测试的中位数。
此处 SQL mget 更慢;批量结果不同。
结果、原始数据与条件

一次调用,两条读取路径。

符合条件的命中返回已存行。未命中或绕过缓存时读取源表。普通 SELECT 查询保留现有路径。

psql │ 主键读取
-- 只需关联一次表。
SELECT local_cache.attach_table('public.items');

-- 按主键读取行。
SELECT local_cache.mget(
  'public.items', ARRAY[42, 7]::bigint[]
);
SQL mget 读取路径 应用在 PostgreSQL 内调用 local_cache.mget。经过适用性与快照检查后,缓存命中返回已存整行载荷。未命中或绕过缓存时读取源表。两条路径均通过同一 PostgreSQL 连接返回行。 PostgreSQL 应用 local_cache.mget 适用性与快照 命中 未命中 / 绕过 已缓存
两条路径均通过同一 PostgreSQL 连接返回序列化整行。符合条件的源表读取可以填充缓存。
行缓存命中省去了哪些工作
SQL mget

每次调用最多 1,024 个键。保留顺序、重复项和 NULL 位置。

普通写入

INSERT、UPDATE 和 DELETE 会使受影响的条目失效。

固定容量

在 PostgreSQL 启动时分配共享行缓存。

快照检查

不符合缓存条件的读取,按 PostgreSQL 可见性规则访问源表。

在每种客户端上
运行相同测试。

Node.js 与 Go。预备 SQL、SQL mget 和 RESP MGET。

统一脚本使用相同的键、批次大小、连接数、时长和结果检查。在你的机器上比较吞吐量、延迟,以及 PostgreSQL CPU 与内存。

运行比较

这符合你的工作负载吗?

正在选择缓存? 比较 PostgreSQL 页、行、物化视图与 Redis.

值得测量的场景

  • 反复使用完整主键查找。
  • 由完整行组成的小型热数据集。
  • 单个可写主库上的 READ COMMITTED。
  • 能够调用显式 SQL API 的应用。

保留普通 SQL 的场景

  • 连接、范围查询、聚合或任意查询结果。
  • RLS、分区表或继承表。
  • 无法安装原生扩展的数据库。
  • 没有测得收益的工作负载。

运行本地演示。

克隆仓库,启动包含示例行的一次性 PostgreSQL 服务器。Docker 构建扩展,并将演示与你的数据库隔离。

需要 Git 与 Docker Compose
git clone https://github.com/profundium/pg_local_cache.git
cd pg_local_cache
docker compose -f examples/compose.yaml up --build --wait

读取示例行并检查缓存命中。已经克隆仓库?在仓库根目录运行最后一条命令。对于现有服务器,请使用安装指南.

在现有服务器上安装需要重启 PostgreSQL。

文档

在本地试用 pg_local_cache在一次性 PostgreSQL 实例中运行 pg_local_cache 2.0,读取示例行、检查缓存命中、测试更新并清理演示,不修改现有数据库。 PostgreSQL 缓存基准测试在 Apple M3 Max 上使用 Node.js、Go 与 RESP 测量 pg_local_cache,提供机器配置、PostgreSQL CPU 和内存数据及测试方法。 PostgreSQL 缓存选择指南根据需要避免的重复工作,在 PostgreSQL 页缓存、预备 SQL、整行缓存、物化视图和外部缓存之间做出选择。 PostgreSQL 与 Redis 的 cache-aside 模式以 PostgreSQL 为权威数据源,理解 Redis cache-aside 的过期读取竞态,并了解 pg_local_cache 的适用边界。 批量查找 PostgreSQL 主键用一次参数化 PostgreSQL 查询替代 N+1 主键读取,按需保留输入位置,并比较显式 pg_local_cache mget 路径。 PostgreSQL 行缓存与 shared_buffers 的比较比较 PostgreSQL 页缓存与 pg_local_cache 2.0 整行缓存:缓存命中省去哪些工作、仍有哪些成本,以及何时不应增加缓存。 PostgreSQL 中的事务感知缓存失效用并发 PostgreSQL 会话测试 pg_local_cache 2.0 失效,检查未提交更新、读取自身写入、回滚、已提交读取以及回退规则。 使用 node-postgres 批量查找行通过参数化 bigint 数组和 JSON 传输在 Node.js 中使用 pg_local_cache 2.0,保留顺序与空值,并与预备 ANY 查询比较。 使用 Go 与 pgx 批量查找行通过 pgx、参数化键和解码后的 JSON 行,在 Go 中使用 pg_local_cache。 通过 RESP 连接使用 redis-cli 或 Node.js 通过 RESP2 读取 PostgreSQL 行,包含认证、客户端配置、可运行示例和清理步骤。 在 PostgreSQL 14–18 上安装 pg_local_cache使用经过验证的 Linux 二进制包或 PGXS 安装 pg_local_cache 扩展,配置预加载、重启、验证,并按流程安全恢复。 pg_local_cache 技术参考pg_local_cache 的 SQL mget、事务感知失效、有界 PostgreSQL 共享内存、监控与可选 RESP2 接口技术参考。

PostgreSQL 缓存实践笔记

全部文章 →

试用前须知

这会替代 shared_buffers 吗?

不会。PostgreSQL 缓存数据库页,此扩展则单独按主键缓存序列化整行。参阅读取路径比较.

它会缓存普通 SELECT 查询吗?

不会。只有显式 local_cache.mget 调用使用 SQL 缓存。已有查询保留 PostgreSQL 的正常执行路径。

它能替代 Redis 吗?

不能。可选 RESP2 接口功能有限,不提供通用 Redis 命令集、TTL、发布订阅或分布式协调。请比较PostgreSQL 与 Redis cache-aside 路径.

如何检查更新与回滚?

失效指南提供双会话测试。可运行示例检查未提交写入、读取自身写入、回滚和已提交更新。