postgresql与redis缓存一致性有五种方案:一、cache-aside(旁路缓存),应用层控制读写,先查缓存未命中则回源数据库并写入,写时先更新db再删缓存;二、write-through(写穿透),数据先写redis再同步落库,由缓存层保障事务一致性;三、基于cdc的sequin自动同步,利用postgresql逻辑复制捕获wal变更,毫秒级实时同步至redis,零侵入强一致;四、双删策略,更新前删缓存、更新db后延迟再删,压缩并发不一致窗口;五、redis作为写前缓冲+异步落库,所有写入先存redis,后台worker扫描并批量同步至postgresql,支持容灾与写缓冲。

当 PostgreSQL 作为主数据源、Redis 作为缓存层协同工作时,若二者间的数据未能严格同步,将导致用户读取到过期或错误的缓存值。以下是多种可落地的缓存一致性设计方案:
一、Cache-Aside(旁路缓存)模式
该模式将缓存控制权交由应用层,读操作优先查 Redis,未命中则回源 PostgreSQL 并写入缓存;写操作先更新 PostgreSQL,再主动失效或更新对应缓存键。其优势在于解耦性强、实现直观,适用于读多写少且对短暂不一致容忍度较高的场景。
1、读取流程:应用发起查询请求,首先执行 GET user:1001 操作。
2、若返回空值,则执行 SQL 查询 SELECT * FROM users WHERE id = '1001'。
3、将查询结果以 SET user:1001 "{"name":"Alice","age":28}" EX 3600 写入 Redis。
4、写入流程:更新数据库后,立即执行 DEL user:1001 删除缓存键,确保下次读取触发回源加载最新数据。
二、Write-Through(写穿透)模式
该模式要求所有写操作必须同步经过缓存层,即数据先写入 Redis,再由缓存组件同步落库。PostgreSQL 更新由 Redis 的写代理或中间件完成,保障缓存与数据库在单次事务中完成写入,避免应用层遗漏缓存更新逻辑。
1、应用调用缓存客户端执行 SET user:1002 "{"name":"Bob","age":32}" EX 3600。
2、Redis 接收命令后,触发预设的写穿透钩子,将结构化数据转换为 SQL 插入语句。
3、通过连接池向 PostgreSQL 提交事务:INSERT INTO users (id, name, age) VALUES ('1002', 'Bob', 32) ON CONFLICT (id) DO UPDATE SET ...。
4、仅当 PostgreSQL 返回成功确认后,Redis 才返回 SET 成功响应,否则抛出异常并回滚。
三、基于 CDC 的自动同步(Sequin 方案)
该方案绕过应用层干预,利用 PostgreSQL 的逻辑复制机制捕获 WAL 日志变更事件,并通过 Sequin 工具实时解析、转换并写入 Redis。整个过程完全脱离业务代码,实现强一致性与零侵入性。
1、在 PostgreSQL 中启用逻辑复制:ALTER SYSTEM SET wal_level = logical; 并重启服务。
Redis 8.2.3 是一款安全优先的高性能键值存储系统。该版本紧急修复了可能引发远程代码执行(RCE)的高危漏洞(CVE-2025-62507),并解决了 HyperLogLog 及 Cuckoo Filter 等数据结构在特定场景下的崩溃问题。建议所有用户立即升级,以保障生产环境的系统稳定与数据安全。
2、创建复制槽:SELECT * FROM pg_create_logical_replication_slot('seq_slot', 'pgoutput');。
3、启动 Sequin 实例,配置 source 为该 slot,target 为 Redis 连接地址,并定义表到 key 的映射规则,例如 users → user:{id}。
4、执行任意 DML 操作如 UPDATE users SET age = 33 WHERE id = '1003';,Sequin 将在毫秒级内将新值同步至 Redis 对应 key。
四、双删策略(防并发脏写)
针对高并发更新场景下因删除缓存时序错乱导致旧值重载的问题,采用“先删缓存→写数据库→延迟再删缓存”的双重删除机制,有效压缩不一致时间窗口,降低并发冲突概率。
1、线程 A 开始更新前,执行 DEL user:1004 清除当前缓存。
2、执行数据库更新:UPDATE users SET email = 'a@new.com' WHERE id = '1004';。
3、启动异步任务,在 500ms 后再次执行 DEL user:1004,覆盖可能在此期间被其他线程误加载的旧值。
4、所有读请求在两次删除之间若发生缓存未命中,均会从数据库加载最新状态并写入缓存,确保最终一致性。
五、Redis 作为写前缓冲 + 异步落库
该架构将 Redis 视为主写入口,所有写请求首先进入 Redis(如 Hash 结构),再由后台 Worker 持续扫描变更并批量同步至 PostgreSQL。系统在数据库不可用时仍可接受写入,具备容灾能力与写放大缓冲特性。
1、应用执行 HSET user:1005 name "Charlie" age 29 email "c@demo.com" 写入 Redis。
2、Worker 进程调用 SCAN 0 MATCH user:* COUNT 100 批量获取待同步 key 列表。
3、对每个 key 执行 HGETALL user:1005 获取完整字段,并构造 UPSERT SQL 语句。
4、使用 psycopg2.extras.execute_batch() 批量提交至 PostgreSQL,失败项记录日志并加入重试队列。










