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

高频更新字段问题思路

对于一金额字段,由于会高频更新字段金额(一秒上百次),该如何设计技术方案处理可能出现的性能、一致性问题呢?

核心挑战

  1. 高并发更新导致数据库性能瓶颈

    一次上百次更新,传统数据库单行更新会产生行级锁争用,影响吞吐量

  2. 数据一致性

    事务隔离级别低,多并发请求同时修改,可能导致脏写;事务隔离级别高,则又会降低并发性能

方案一:基于数据库的行级乐观锁

适合单实例数据库,确保高并发下的数据一致性,适用于金额更新频率不超过1000TPS情况

方案二:基于数据库的批量更新

引入缓存(如redis)来累积一定时间窗口内的金额变动记录,然后批量更新数据库,减少update次数,提供吞吐量

适用金额更新频率很高的场景,降低数据库写入压力

方案三:基于Redis的计数器+异步持久化

所有金额更新优先写入redis,然后通过异步任务(如kafka+worker)定期更新redis数据到数据库

适用于极高吞吐量(>10000TPS),并且可以接受最终一致性

方案四:基于分布式消息队列

每次金额变动部署直接更新数据库,而是发送到kafka队列

后端消费worker进行批量更新

适合高并发、大规模分布式交易系统,确保高吞吐和一致性

方案五:读写分离:redis提供读,insert写

改update为insert,在每次insert时更新redis,然后redis对外提供读取金额服务

这样改的insert的在此抽象一下,就是一种账单的概念

方案六:魔改mysql:在数据库层面进行合并提交

在 MySQL Server 层排队批量提交多个事务,InnoDB 只用拿一次行锁,提交成功之后在 Server 层构造结果

Ref

  1. https://www.v2ex.com/t/1109295#reply51

相关文章:

  • 【C++】基础入门(详解)
  • CAS单点登录(第7版)9.属性
  • 关于Redis的主从复制(上)
  • 【大模型部署实战】Ollama如何保持模型常驻内存,或者显存,如何立刻释放
  • 前缀和(Prefix Sum)算法笔记C++
  • ROS1基础学习[记录b站阿杰]
  • 通用节流函数
  • 前缀和、区间和的差别
  • 第一节 Python简介、标识符、注释、六大数据类型简介、for循环、运算符
  • Vue极简插件安装
  • 【快速入门】Unity 常用组件(功能块)
  • 自定义组件数据监听器案例,纯数据字段,自定义组件生命周期,页面的生命周期,插槽
  • C++ references
  • XMOS的多项音频技术创新将大模型与边缘AI应用密切联系形成生态化合
  • Map 和 Set
  • 类与对象C++详解(中)-----构造函数与析构函数
  • 大数据学习(46) - Flink按键分区处理函数
  • dl学习笔记(11):VGG,NIN,GooleNet经典架构pytorch实现
  • 跳跃游戏 II - 贪心算法解法
  • nacos2.0.4源码启动
  • 一女游客在稻城亚丁景区因高反去世,急救两个多小时未能恢复生命体征
  • 以色列媒体:哈马斯愿意释放部分人员换取两个月停火
  • 美国务卿与以色列总理通话,讨论加沙局势
  • 第十届曹禺剧本奖上海揭晓,首次开放个人申报渠道
  • 《歌手》回归,人均技术流,00后整顿职场
  • 中国纪检监察刊文:力戒形式主义官僚主义关键是要坚持实事求是