完整教程:PostgreSQL + Redis + Elasticsearch 实时同步方案实践:从触发器到高性能搜索

news/2025/11/9 15:02:11/文章来源:https://www.cnblogs.com/ljbguanli/p/19204285

完整教程:PostgreSQL + Redis + Elasticsearch 实时同步方案实践:从触发器到高性能搜索

在现代系统架构中,我们常常既希望:

  • PostgreSQL 担任主数据存储;
  • Redis 提供高速缓存;
  • Elasticsearch 提供模糊搜索和全文索引。

但如何让这三者实时同步数据,既可靠又简单?
本文将带你从原理到实现,构建一个轻量级、高性能、可扩展的同步方案。


在这里插入图片描述

一、问题背景

在中大型业务系统中,我们常见这样的三层数据结构:

系统职责特点
PostgreSQL结构化主数据存储强一致、可靠
Redis高频访问缓存高速读写
Elasticsearch搜索/模糊查询支持全文匹配、分词

理想状态下,当 PostgreSQL 中的数据发生变化时:

  • Redis 缓存应立即更新;
  • Elasticsearch 索引应保持一致。

但如果数据量大、变更频繁,人工同步或定时同步就会滞后。
这时我们需要一种轻量但实时的方案。


二、常见同步方案对比

方案实时性实现复杂度运维成本适用场景
定时扫描 + 更新时间字段分钟级简单系统
Kafka / Debezium CDC毫秒级⭐⭐⭐⭐⭐⭐⭐大型分布式系统
Trigger + LISTEN/NOTIFY + Worker秒级⭐⭐⭐⭐✅ 中小系统首选

本文选用第三种方案:

PostgreSQL Trigger + LISTEN/NOTIFY + 异步 Worker 实时同步

它无需额外组件,延迟可低至 1 秒以内,兼顾可靠性与简洁性。


三、系统架构设计

同步流程如下图所示:

AFTER Trigger
LISTEN 订阅
查询变更记录
更新/删除
PostgreSQL 表
NOTIFY 通知 JSON
Worker 程序
Redis 缓存
Elasticsearch 索引

核心机制说明:

  1. Trigger:PostgreSQL 在表数据增删改时触发。
  2. NOTIFY:数据库内置的轻量级消息通道。
  3. Worker:独立进程监听事件,异步更新 Redis/ES。
  4. 幂等性设计:重复更新不会出错,保证数据最终一致。

四、PostgreSQL 端实现

1️⃣ 创建触发函数

CREATE OR REPLACE FUNCTION notify_data_change()
RETURNS trigger AS $$
DECLARE
payload JSON;
BEGIN
IF (TG_OP = 'DELETE') THEN
payload := json_build_object('table', TG_TABLE_NAME, 'action', TG_OP, 'id', OLD.id);
ELSE
payload := json_build_object('table', TG_TABLE_NAME, 'action', TG_OP, 'id', NEW.id);
END IF;
PERFORM pg_notify('data_changes', payload::text);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

2️⃣ 为目标表添加触发器

CREATE TRIGGER data_change_trigger
AFTER INSERT OR UPDATE OR DELETE ON your_table
FOR EACH ROW EXECUTE FUNCTION notify_data_change();

⚠️ 注意:

  • 触发器只传递轻量级 JSON(表名 + 操作 + 主键 ID);
  • Worker 再根据 ID 查询最新完整数据。

五、Worker 实时监听与同步实现

以下示例使用 Python + psycopg2 + redis + elasticsearch-py

import psycopg2, select, json, redis
from elasticsearch import Elasticsearch
# 初始化连接
r = redis.Redis(host='localhost', port=6379, db=0)
es = Elasticsearch(['http://localhost:9200'])
conn = psycopg2.connect("dbname=test user=postgres password=123456")
conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
cur = conn.cursor()
cur.execute("LISTEN data_changes;")
print("Listening on channel data_changes...")
def fetch_row(cur, table, id):
cur.execute(f"SELECT * FROM {table} WHERE id = %s", (id,))
return cur.fetchone(), [desc[0] for desc in cur.description]
while True:
if select.select([conn], [], [], 5) == ([], [], []):
continue
conn.poll()
while conn.notifies:
notify = conn.notifies.pop(0)
payload = json.loads(notify.payload)
action, table, id_ = payload['action'], payload['table'], payload['id']
if action in ['INSERT', 'UPDATE']:
cur2 = conn.cursor()
row, columns = fetch_row(cur2, table, id_)
if not row:
continue
doc = dict(zip(columns, row))
# Redis 同步
r.hset(f"{table}:{id_}", mapping=doc)
# Elasticsearch 同步
es.index(index=table, id=id_, document=doc)
cur2.close()
elif action == 'DELETE':
r.delete(f"{table}:{id_}")
es.delete(index=table, id=id_, ignore=[404])

六、可靠性与性能优化

问题解决方案
Worker 停机期间可能漏消息启动时根据 updated_at 字段扫描补偿
通知频繁引发阻塞Worker 内部用队列异步处理(如 asyncio 或 Redis Stream)
Redis/ES 更新失败增加重试机制或死信队列
数据量极大可考虑引入 Kafka / Debezium 替代触发器同步

七、方案优劣对比总结

特性Trigger + LISTENDebezium (CDC)定时扫描
实时性✅ 秒级✅ 毫秒级❌ 分钟级
复杂度⭐⭐⭐⭐⭐⭐
成本⭐⭐⭐⭐⭐⭐
可维护性✅ 高⚠️ 中✅ 高
适用规模中小型大型小型
实现语言任意 (Python/Node/Go)Java/Kafka任意

结论:

对于中小型项目、单库多缓存/索引场景,
最推荐方案是 ——
PostgreSQL Trigger + LISTEN/NOTIFY + 异步 Worker 实时同步


八、最终方案架构图

事件通知
Worker
拉取数据
同步索引
监听 LISTEN data_changes
更新 Redis
更新 Elasticsearch
PostgreSQL
Trigger AFTER INSERT/UPDATE/DELETE
表 your_table
NOTIFY data_changes

九、结语

本方案实现了:

对于希望“简单、实时、可靠”的中小团队来说,
这就是一条足够优雅的生产级道路


实用小工具

App Store 截图生成器、应用图标生成器 、在线图片压缩和 Chrome插件-强制开启复制-护眼模式-网页乱码设置编码
乖猫记账,AI智能分类的最佳聊天记账App。
Elasticsearch可视化客户端工具

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/960515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于最小二乘法的五颗可见卫星伪距定位

一、数学模型构建 1.1 伪距观测方程 对于每颗可见卫星i,观测方程可表示为:(\(x,y,z\)):接收机三维坐标(待解算) (\(x_i,y_i,z_i)\):卫星\(i\)的ECEF坐标(由星历计算) \(Δt\):接收机钟差(待解算) \(ϵi\):…

new day

今日进行二叉树练习,比较不熟练,需多多练习。继续进行java语法复习。未遇到问题。

2025 年 11 月冰水机厂家推荐排行榜,工业冰水机,冷却冰水机,制冷冰水机,低温冰水机公司精选

2025年11月冰水机厂家推荐排行榜:工业温控设备专业选购指南 在工业制造领域,温控设备作为生产过程中不可或缺的关键环节,其性能优劣直接影响产品质量和生产效率。冰水机作为工业温控系统的核心设备,在塑料成型、食…

2025 年 11 月工业冰水机厂家权威推荐榜:专业制冷与高效节能口碑之选,工业冰水机,工业冷水机,工业冷冻机公司推荐

2025 年 11 月工业冰水机厂家权威推荐榜:专业制冷与高效节能口碑之选 在当今工业生产领域,制冷设备已成为保障生产效率和产品质量的关键基础设施。工业冰水机作为工业生产中温度控制的核心设备,其性能优劣直接影响生…

完整教程:用 Java 指挥 3500 只机器人跳舞——Ocado 高密度仓储集群的架构实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

词根学习笔记 | Alter系列 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

图片加字,用我最爽

添加后的文字可用鼠标拖拽——没这个就成了最不爽了。 HTML+JavaScript:<html><head><meta charset="UTF-8"> <title>图片加字,用我最爽</title> <style> body {displ…

new day

今日背四级单词,写各个学科作业,明日把欠缺学科补补,没啥大问题。

How to do PhD work

人是需要有足够的内驱力的偶然间因为代课老师,网络资源后翻阅了范老师的履历,一边感慨一边深思,上午简单看了下论文后实在是不想继续对着看不懂的公式抓耳挠腮了。 老师的回答:作者:范睿 Ranger链接:https://www…

关于计算机语言的学习

关于计算机语言的学习关于计算机语言的学习 在这个系列的笔记中,我将记录下自己在研究计算机语言的过程中所积累的一些心得体会,笔记的内容将会包括我对编程语言、标记语言的了解,以及我学习各种语言的具体过程。希…

VSCODE脚本禁止:因为在此系统上禁止运行脚本。有关详细信息,请参阅。。。

在Terminal执行CMD命令时无法成功运行报错: npm : 无法加载文件 D:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。有关详 细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about…

VisionPro学习笔记-CogColorExtractorTool和CogColorSegmenterTool

CogColorExtractorTool CogColorExtractorTool CogColorExtractorTool 是康耐视(Cognex)VisionPro视觉软件中专门用于颜色提取的工具。其核心功能是从RGB彩色图像中提取符合特定颜色定义的像素,并生成相应的灰度图像…

计算机视觉(opencv)——基于MediaPipe与机器学习的手势识别高效的系统

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年合肥品牌设计团队专业排行

摘要 2025年,品牌设计行业正迎来数字化和个性化浪潮,企业愈发重视品牌形象以提升市场竞争力。本文基于行业数据和用户口碑,为您推荐Top5品牌设计团队,并提供详细排名和选择指南,供企业参考。表单数据来源于权威市…

2025年国内品牌设计公司top5推荐:专业团队口碑榜单

摘要 随着2025年品牌设计行业的快速发展,企业对于专业设计团队的需求日益增长,行业整体趋向数字化、个性化和跨文化融合。本文基于市场调研和用户口碑数据,精选top5品牌设计公司,并提供详细比较和表单说明供参考,…

英语_中考作文_An Act of Kindness_待读

An Act of Kindness Last semester, my classmate Li Hua sat next to me. He had trouble with learning English and often felt discouraged. Seeing this, I decided to give him a helping hand. I shared my not…

[题解]【MX-S10】梦熊 NOIP 2025 模拟赛 2 FeOI Round 4 T1~T2

T1. P14460 寻雾启示 考虑 DP。令 \(f_i\) 为到达位置 \(i\) 的最短时间。 转移时,考虑枚举最后一个折返点 \(j\)。即:先从 \(0\) 经过一系列步骤到 \(j\)。 从 \(j\) 折返到 \(0\),一直等待到铁锭足够。 先跑步到 …

小聊一下 带圈的数字,以及罕用字的显示、字体文件的分割

以前我在博客《文本文件中一些特殊的字符用法》中提到过,unicode中有一类字符用于在前一字符的右上角的显示字母或数字,如 也有一类在前一字符的右下角显示字母或数字。 ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ⁰ ⁺ ⁻ ⁽ ⁾ ⁿ ⁼ ₐ…

CSP挂分记

本文同步发布至洛谷文章。 上午普及组,前两道题差不多 \(30\) 分钟就切掉了,但是第三题就卡住了,刚开始想弄枚举或贪心,发现写不出来,于是考虑动态规划。差不多半个小时左右,就想出正解了。而且赛后看题解,似乎…

实用指南:Agent 的感知-决策-行动循环实现

实用指南:Agent 的感知-决策-行动循环实现pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…