PostgreSQL 缓存失效:延迟填充竞态
逐步分析旧读取如何在提交后重新填入已删除的缓存键,并理解发布屏障、快照、回滚与请求本地缓存。
阅读文章通过经过身份验证的 RESP MGET 按主键读取行。PostgreSQL 写入会自动使受影响的缓存项失效。
经过身份验证的 RESP API · PostgreSQL 14–18 · 开源
3.1.0 按字节管理 arena 容量;预算允许时可容纳数百万个小键。新增分区锁、单键命中零分配路径、更低开销的写入跟踪,以及关系锁阻塞时的延迟未命中处理。升级指南。
3.1.0 · 最终构建 c431bcc
210k请求/秒 · RESP MGET
每个固定的服务器物理核心
热键 · 256 个客户端 · Go/pgx
符合条件的命中返回已存行。未命中或绕过缓存时读取源表。普通 SELECT 查询保留现有路径。
-- 只需关联一次表。
SELECT local_cache.attach_table('public.items');
-- 按主键读取行。
MGET CRUD:pglc_demo.public.items:{"id":42} CRUD:pglc_demo.public.items:{"id":7}
需要身份验证,每个请求最多 1,024 个键。缺失行返回 null。
INSERT、UPDATE 和 DELETE 会使受影响的条目失效。
在 PostgreSQL 启动时分配共享行缓存。
不符合缓存条件的读取,按 PostgreSQL 可见性规则访问源表。
Node.js 与 Go。预备 SQL、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 -f examples/compose.resp.yaml up --build --wait
读取示例行并检查缓存命中。已经克隆仓库?在仓库根目录运行最后一条命令。对于现有服务器,请使用安装指南.
在现有服务器上安装需要重启 PostgreSQL。
逐步分析旧读取如何在提交后重新填入已删除的缓存键,并理解发布屏障、快照、回滚与请求本地缓存。
阅读文章使用预备 SQL 和 RESP MGET 设计公平的 PostgreSQL 行缓存比较,分别考察热读取、未命中、批次大小、写入和客户端成本。
阅读文章替代 N+1 主键查询,同时保留重复 ID、输入顺序、NULL 位置和缺失行,比较 ANY、WITH ORDINALITY 与 RESP MGET。
阅读文章pg_local_cache 3.1.0 将热点行保存在 PostgreSQL 共享内存中并通过 RESP 提供读取。对比 Valkey 与预编译 SQL,不返回过期行。
阅读文章不会。PostgreSQL 缓存数据库页,此扩展则单独按主键缓存序列化整行。参阅读取路径比较.
不会。只有经过身份验证的 RESP MGET 会使用共享行缓存。现有查询仍按 PostgreSQL 的正常路径执行。
不能。RESP2 接口功能有限,不提供通用 Redis 命令集、TTL、发布订阅或分布式协调。请比较PostgreSQL 与 Redis cache-aside 路径.