当前位置: 首页 > news >正文

写入瓶颈到削峰填谷:基于 Redis 与 MySQL 的高并发写入工程化方案

1. 方案背景与目标

1.1 为什么需要优化高并发写入?

在高并发场景下(如 注册、登录、提交订单、IoT 设备上报),直接写入数据库会导致:

  • 数据库连接池耗尽(如 MySQL 的 max_connections被打满)。
  • 事务锁竞争(如行锁、表锁导致请求阻塞)。
  • 磁盘 I/O 和 CPU 压力激增(如 InnoDB 日志刷盘、索引维护)。
  • 接口响应变慢(P99 延迟飙升,用户体验下降)。

目标:通过 Redis 缓冲 + 批量入库 + 最终一致性,将瞬时高并发写入 平滑削峰,提升系统吞吐量(QPS),同时保证数据最终不丢失。

2. 整体架构设计

2.1 核心流程

  1. 客户端 提交写入请求(如注册信息)。
  2. Gin 接口层
    • 幂等校验(防止重复提交,如用 Redis SETNX 对 phone加锁)。
    • 快速写入 Redis 队列(如 LPUSH reg_queue,JSON 格式存储请求数据)。
    • 立即返回(代表请求已接收,后续异步处理)。
  3. 批处理 Worker(独立 Goroutine):
    • 定时/定量触发(如每 100ms 或每 500 条数据)。
    • 从 Redis 拉取批量数据(如 BRPOP reg_queue 50ms)。
    • 去重 & 合并(按业务唯一键,如 phone去重)。
    • 批量写入 MySQL(使用 INSERT ... ON DUPLICATE KEY UPDATE)。
    • 成功后清理 Redis 消息(或标记为已处理)。
  4. 结果查询(可选):客户端通过 request_id轮询或回调获取最终状态。

2.2 关键组件

组件 作用 技术选型
Redis 缓冲队列、幂等去重、结果缓存 Go-Redis(官方库)
MySQL 最终数据存储 GORM / database/sql
批处理 Worker 定时/定量拉取 Redis 数据并入库 Goroutine + Channel
Gin HTTP 接口层 Gin Framework

3. 详细实现(Go + Gin 代码示例)

3.1 1. 幂等校验(防止重复提交)

目标:同一 phone10 秒内 只能提交一次,避免重复写入 Redis 和数据库。

// redis_dedup.go
package mainimport ("context""fmt""github.com/redis/go-redis/v9""time"
)var rdb *redis.Clientfunc initRedis() {rdb = redis.NewClient(&redis.Options{Addr:     "localhost:6379", // Redis 地址Password: "",               // 无密码DB:       0,                // 默认 DB})
}// TryAcquireDedup 尝试获取幂等锁(10 秒过期)
func TryAcquireDedup(ctx context.Context, phone string) bool {key := fmt.Sprintf("reg:dedup:%s", phone)// SET key "1" NX EX 10 → 如果 key 不存在则设置,并设置 10 秒过期ok, err := rdb.SetNX(ctx, key, "1", 10*time.Second).Result()if err != nil {fmt.Printf("Redis SETNX 失败: %v\n", err)return false}return ok
}

在 Gin 接口层调用

// main.go
r := gin.Default()
initRedis() // 初始化
http://www.dtcms.com/a/556716.html

相关文章:

  • 一些常见的编程软件
  • Nginx Stream模块开发:TCP/UDP代理扩展
  • 开网站做外贸中国做网站正邦
  • K8s Dashboard运维技巧全面经验总结
  • 合肥创业网从百万到千万 网站怎么优化
  • Flutter boost权威指南
  • 人工智能、机器学习与神经网络:解锁智能时代的核心密码
  • Kubernetes 上的 GitLab + ArgoCD 实践(三):使用 ArgoCD 打通 CD 流程
  • spark-SQL学习
  • SSM基于网络安全维护的机房设备管理19rya(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • ProcessLifecycleOwner 完全指南:优雅监听应用前后台状态
  • html css js网页制作成品——珠帘玉幕HTML+CSS网页设计(4页)附源码
  • 开启RN之旅——小试牛刀
  • Unity使用PP-MattingV2实现人像分割
  • 智能模型对齐(一致性)alignment
  • VSCode SSH远程连接失败 最速解决方案
  • 网站开发旅游前台模板临海建设规划局网站
  • 加载YOLO模型,处理mp4视频
  • 基于 GEE 利用 GHSL(100m)数据的区域建成区时空变化量化分析
  • day22_用户授权 头像上传
  • 网站识别爬虫(包括以浏览器插件形式运行的爬虫)主要通过分析请求特征、行为模式等差异来区分人类用户和自动化程序
  • 网站建设费用IPseo官网优化详细方法
  • 汽车OTA CDN HTTPS MQTT OCSP
  • python异步编程 -- 深入理解事件循环event-loop
  • 京津冀工业智能体赋能:重构产业链升级新篇章
  • AIGEO系统到底是什么?
  • 日志系统的介绍及前置技术
  • 安居客做网站广州建设网站公司哪家好
  • 【JUnit实战3_22】 第十三章:用 JUnit 5 做持续集成(下):Jenkins + JUnit 5 + Git 持续集成本地实战演练完整复盘
  • 【Linux】 CI/CD 管道优化:使用 GitHub Actions/GitLab CI 提速构建和部署