PostgreSQL 与 Redis 缓存一致性设计方案

舞夢輝影

舞夢輝影

2026-05-08

360人浏览

原创

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

postgresql 与 redis 缓存一致性设计方案 - php中文网

当 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
Redis 8.2.3

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,失败项记录日志并加入重试队列。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

redis

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Selenium WebDriver元素定位与页面操作教程
Selenium WebDriver元素定位与页面操作教程

本专题整理Selenium WebDriver元素定位、XPath、CSS Selector、等待机制、窗口切换、Frame处理、Alert弹窗、Cookie操作和文件上传等核心用法。

2026.08.05

0

26

Selenium Grid分布式测试与并行执行教程
Selenium Grid分布式测试与并行执行教程

本专题整理Selenium Grid架构、远程WebDriver、并行测试、Docker部署、Kubernetes动态Grid、浏览器矩阵和测试环境扩展方法,适合进阶自动化测试团队使用。

2026.08.05

0

18

Selenium常见报错排查与自动化测试稳定性
Selenium常见报错排查与自动化测试稳定性

本专题整理Selenium常见报错、驱动版本问题、元素找不到、点击失败、等待超时、浏览器闪退、脚本不稳定和测试用例维护方法。

2026.08.05

0

17

墨刀AI提示词教学
墨刀AI提示词教学

本合集由PHP中文网精心整理,为您提供全面的墨刀AI提示词教学。内容涵盖高质量原型撰写公式与实操窍门,助您轻松掌握AI设计工具。无论是零基础入门还是进阶技巧,都能让您快速上手,大幅提升产品设计与协作效率。

2026.08.04

11

21

墨刀AI完整入门
墨刀AI完整入门

PHP中文网为您倾力打造墨刀AI保姆级入门指南完整版!本合集从零基础讲起,涵盖AI生成原型、提示词优化、图片转原型及多轮对话等核心功能。无论您是新手还是进阶用户,都能轻松掌握产品设计全流程。快来PHP中文网,一键解锁高效设计技巧,让想法即刻成型!

2026.08.04

8

20

墨刀AI进阶技巧
墨刀AI进阶技巧

本合集由PHP中文网精心整理,为您提供墨刀AI核心进阶策略指南。内容涵盖高效提示词写作、原型智能生成与微调、结构化导图制作及行业分析报告输出等实战技巧。助您轻松掌握AI设计工具,大幅提升产品设计与团队协作效率。

2026.08.04

10

14

火山引擎实名认证失败怎么办
火山引擎实名认证失败怎么办

火山引擎实名认证失败可能与证件信息填写错误、姓名或企业信息不一致、证件照片不清晰、营业执照状态异常、手机号验证失败或审核资料不完整有关。本专题整理个人认证、企业认证、资料上传、审核退回、重新提交和认证不通过的常见处理方法。

2026.08.04

5

10

火山引擎域名备案流程详解
火山引擎域名备案流程详解

火山引擎域名备案适合需要在火山引擎云服务器、对象存储、CDN或网站服务上绑定域名的用户参考。本专题整理备案入口、账号实名认证、备案类型选择、主体信息填写、网站信息提交、资料上传、初审核验、管局审核和备案失败排查,帮助用户完成网站上线前的备案流程。

2026.08.04

1

10

火山引擎DNS解析配置步骤
火山引擎DNS解析配置步骤

使用火山引擎DNS解析网站域名时,需要确认域名已完成管理接入,并正确配置服务器IP、CNAME地址或验证记录。本专题整理域名添加、记录类型选择、TTL设置、解析状态检查、备案和访问测试等流程,适合新手搭建网站时参考。

2026.08.04

3

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 9万人学习