数据库高频更新问题 谁遇到过没 有啥好的解决方案部

120 天前
 455035319

一个字段金额,一秒可能要更新上百次,就会卡顿死锁,应该怎么处理比较好

5052 次点击
所在节点    MySQL
53 条回复
iyiluo
120 天前
放内存或者 redis ,定期写入数据库
GPLer
120 天前
时序数据库或不可变数据库?反正用插入替代修改应该就能解决。
mark2025
120 天前
1. 放内存或者 redis 。不过保持数据一致性需要额外开销
2. 数据库存储用本地高速磁盘,比如 NVME
3. 如果是 pgsql 数据库
3.1 字段 FILLFACTOR 设定很小值(比如 1 )提高写入性能
3.2 关闭 full page write 开关(需要磁盘磁层有相应的安全措施,比如 ZFS 文件系统)
3.3 关闭 sync 同步写入(需要磁盘磁层有相应的安全措施,比如 UPS 、阵列卡电池)
godall
120 天前
我建议是修改业务逻辑,标准的读写分离:
1 、update 改为 insert ,插入数据同时更新 redis 。
2 、增加 redis ,提供读服务

这样不会有问题,即使突然挂了,数据还在数据库里,重启初始化 redis 就行了。
455035319
120 天前
@godall
@mark2025
@GPLer
@iyiluo
感谢大佬们 我试着调整下
21231sv
120 天前
有没有大佬解释下为什么 1 秒更新上百次就会卡顿死锁
coderzhangsan
120 天前
现在的问题是数据库更新并发太高,数据库负载扛不住;楼上已经给出了问题相关解决方案,我抛砖引玉总结下楼上解决方案思路。

1. 从降低并发负载角度来看,常规是采取削锋,控制数据库并发流量,例如可以使用消息队列处理,控制好消费流量即可。
2.从提高并发负载角度来看,使用内存缓存替代传统关系型数据库或内存缓存作为中间层.
3.从提高数据库行锁并发角度来看,业务策略调整,用写入替代更新,数据量会飙升,后续是否考虑分表或者定时清理数据。
4. 提升机器配置。
CEBBCAT
120 天前
可不可以请假下是什么业务场景,怎么压力都堆到 DB 来了?
CEBBCAT
120 天前
@CEBBCAT #8 oops 粗心打错,“请教下”
455035319
120 天前
一个购票系统
@CEBBCAT
CEBBCAT
120 天前
@455035319 #10 购票系统,单行,RPS 数百,类型为金额,这是动态定价吗家人😂

但价格频繁变动,用户需要支付的金额也会变化,这场景太抓马了
skallz
120 天前
@CEBBCAT 确实没见过这种,这种高频数据写入场景只在物联网中遇见过,用的也是时序数据库。。。
lasuar
120 天前
这不跟交易系统一样了,已经不适合用 mysql 实时存储了,都是放内存数据库,再延时落地 mysql 。
lessMonologue
120 天前
@21231sv 抢锁等待更新,占用数据库链接
vveexx
120 天前
楼上大佬给的方案已经足够多,但是刚又想到一种。如果价格是可预知的,提前生成出来所有可能的值应该也能解决。具体的最好能把场景贴的太详细一点
qyvlik
120 天前
热点账号的问题。
rds 范畴内: 分散更新,合并读取;追加记录,合并更新;如下:
1. 多个账户,增加资金时哪个空闲用哪个;扣除资金如果不够,还是要锁全部账户。
2. insert 记录,作为待结算数据,然后再批次更新回主记录。

非 rds 范畴:
1. 不考虑用 rds 了,上 redis 等非关系数据库。
2. 如果怕 redis 丢数据,用 in-memory + kafka ,in-memory 就是直接 java ( rust 也许更快)内存维护最新状态(本地内存可比 redis 快多了),kafka 记录变动流水( kafka 容量可比 redis 大多了)。
pony2335
120 天前
@godall 这个靠谱
pony2335
120 天前
@lasuar 写内存不好保持一致性吧。 如果内存突然挂了,交易丢失是很严重的事故。 不是很懂,望讨论。
zpfhbyx
120 天前
可以维护一个 token 池子 这个池子的 token 可以一次性生成, 可以随时补充, 每个 token 对应一个价格, 然后预扣, 最后统计池子中没用的 token 余额加回就好了..
lasuar
120 天前
@pony2335 #18 既然是写内存,那这种数据肯定是允许丢失的,比如 1s 中变化上百次的字段,丢失其中第 99 次的数据并不影响什么,因为系统恢复后,马上又会收到最新的数据。
如果发生交易,那交易记录是从内存中获取实时价格,然后记录本身要入持久化数据库的(而不是写内存)。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://yangjunhui.monster/t/1109295

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX