PostgreSQL 缓存失效:延迟填充竞态
逐步分析旧读取如何在提交后重新填入已删除的缓存键,并理解发布屏障、快照、回滚与请求本地缓存。
阅读文章通过 SQL mget 或 RESP 按主键读取行。PostgreSQL 写入会自动使受影响的缓存项失效。
显式 SQL API · PostgreSQL 14–18 · 开源
本地测量 · 2026 年 9 月 15 日
839,678请求/秒 · RESP MGET
3.31× 预备 SQL 的吞吐量
仅针对本次单键比较
符合条件的命中返回已存行。未命中或绕过缓存时读取源表。普通 SELECT 查询保留现有路径。
-- 只需关联一次表。
SELECT local_cache.attach_table('public.items');
-- 按主键读取行。
SELECT local_cache.mget(
'public.items', ARRAY[42, 7]::bigint[]
);
每次调用最多 1,024 个键。保留顺序、重复项和 NULL 位置。
INSERT、UPDATE 和 DELETE 会使受影响的条目失效。
在 PostgreSQL 启动时分配共享行缓存。
不符合缓存条件的读取,按 PostgreSQL 可见性规则访问源表。
Node.js 与 Go。预备 SQL、SQL mget 和 RESP MGET。
统一脚本使用相同的键、批次大小、连接数、时长和结果检查。在你的机器上比较吞吐量、延迟,以及 PostgreSQL CPU 与内存。
运行比较正在选择缓存? 比较 PostgreSQL 页、行、物化视图与 Redis.
克隆仓库,启动包含示例行的一次性 PostgreSQL 服务器。Docker 构建扩展,并将演示与你的数据库隔离。
git clone https://github.com/profundium/pg_local_cache.git
cd pg_local_cache
docker compose -f examples/compose.yaml up --build --wait
读取示例行并检查缓存命中。已经克隆仓库?在仓库根目录运行最后一条命令。对于现有服务器,请使用安装指南.
在现有服务器上安装需要重启 PostgreSQL。
逐步分析旧读取如何在提交后重新填入已删除的缓存键,并理解发布屏障、快照、回滚与请求本地缓存。
阅读文章使用预备 SQL、SQL mget 与 RESP MGET 设计公平的 PostgreSQL 行缓存比较,分别考察热读取、未命中、批次大小、写入和客户端成本。
阅读文章替代 N+1 主键查询,同时保留重复 ID、输入顺序、NULL 位置和缺失行,比较 ANY、WITH ORDINALITY 与 SQL mget。
阅读文章不会。PostgreSQL 缓存数据库页,此扩展则单独按主键缓存序列化整行。参阅读取路径比较.
不会。只有显式 local_cache.mget 调用使用 SQL 缓存。已有查询保留 PostgreSQL 的正常执行路径。
不能。可选 RESP2 接口功能有限,不提供通用 Redis 命令集、TTL、发布订阅或分布式协调。请比较PostgreSQL 与 Redis cache-aside 路径.
失效指南提供双会话测试。可运行示例检查未提交写入、读取自身写入、回滚和已提交更新。