在 PostgreSQL
内部缓存行数据。

通过经过身份验证的 RESP MGET 按主键读取行。PostgreSQL 写入会自动使受影响的缓存项失效。

经过身份验证的 RESP API · PostgreSQL 14–18 · 开源

3.1.0 按字节管理 arena 容量;预算允许时可容纳数百万个小键。新增分区锁、单键命中零分配路径、更低开销的写入跟踪,以及关系锁阻塞时的延迟未命中处理。升级指南。

3.1.0 · 最终构建 c431bcc

210k请求/秒 · RESP MGET

每个固定的服务器物理核心
热键 · 256 个客户端 · Go/pgx

Valkey · io-threads=2N
91.5k 请求/秒
预备 SQL
23.2k 请求/秒
私有 10 GbE 虚拟机 · Xeon Gold 6354 · 固定到一个物理核心。
单核心时 Valkey io-threads=1 达到 180k 请求/秒,每请求服务器 CPU 最低。
结果、原始数据与条件

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

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

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

-- 按主键读取行。
MGET CRUD:pglc_demo.public.items:{"id":42} CRUD:pglc_demo.public.items:{"id":7}
RESP MGET 读取路径 应用发送经过身份验证的 RESP MGET。符合条件的缓存命中会返回已存的整行载荷。未命中或绕过时,使用已配置的 worker 角色读取源表,并通过 RESP 返回该行。 PostgreSQL 应用 RESP MGET 适用性与快照 命中 未命中 / 绕过 已缓存行 源表
两条路径都会通过 RESP 返回整行。读取源表时可以填充缓存。
行缓存命中省去了哪些工作
RESP MGET

需要身份验证,每个请求最多 1,024 个键。缺失行返回 null。

普通写入

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

固定容量

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

Fence 代次与负载校验

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

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

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

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

运行比较

这符合你的工作负载吗?

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

值得测量的场景

  • 反复使用完整主键查找。
  • 由完整行组成的小型热数据集。
  • 单个可写主库上的 READ COMMITTED。
  • 能够使用经过身份验证的 RESP MGET 的应用。

保留普通 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 -f examples/compose.resp.yaml up --build --wait

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

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

文档

在本地试用 pg_local_cache在一次性 PostgreSQL 实例中运行 pg_local_cache 3.1.0,通过 RESP 读取示例行、检查缓存命中、测试更新并清理演示,不修改现有数据库。 在 PostgreSQL 14–18 上安装 pg_local_cache安装经过验证的 Debian 或 RPM 软件包,使用 PGXN 或 PGXS,配置 preload,重启 PostgreSQL,并初始化、升级或卸载 pg_local_cache。 RESP 客户端使用 RESP2、MGET、令牌认证和原生 TLS,将 Redis 兼容客户端连接到 pg_local_cache。 PostgreSQL 缓存基准测试,3.1.0pg_local_cache 3.1.0 双机测试结果:固定与全机读取、写入开销、写入期间读取及测试方法。 pg_local_cache 技术参考参考文档涵盖 RESP 读取、支持的表、事务屏障、TLS、共享内存、指标和 PostgreSQL 设置。 将 pg_local_cache 升级到 3.1.0从 3.0.0 或 2.x 升级 pg_local_cache,检查 3.1 容量与 worker 设置,并在重启后验证扩展。 PostgreSQL 缓存方案决策指南比较 PostgreSQL 页面缓存、预备 SQL、整行缓存、物化视图和 Redis,了解各读取路径能省去哪些工作。 批量查找 PostgreSQL 主键了解如何避免主键读取中的 N+1 请求,并通过经过身份验证的 RESP MGET 批量读取完整行。 PostgreSQL 与 Redis cache-aside比较由应用管理的 Redis cache-aside 与 pg_local_cache RESP 读取,包括过期填充竞争和写入失效。 PostgreSQL 行缓存与 shared_buffers 对比比较 PostgreSQL 页面缓存和 pg_local_cache 整行缓存:可省去的源数据工作、缓存成本,以及适合继续使用普通 SQL 的工作负载。 PostgreSQL 中的事务感知缓存失效了解 PostgreSQL 触发器如何在提交、回滚和并发缓存填充期间保护 RESP 行读取。

PostgreSQL 缓存实践笔记

全部文章 →

试用前须知

这会替代 shared_buffers 吗?

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

它会缓存普通 SELECT 查询吗?

不会。只有经过身份验证的 RESP MGET 会使用共享行缓存。现有查询仍按 PostgreSQL 的正常路径执行。

它能替代 Redis 吗?

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

如何检查更新与回滚?

失效指南介绍写入时的行为。升级指南说明从 3.0.0 升级到 3.1.0,以及此前从 2.x 升级的步骤。