请问这种业务场景,什么数据库比较合适,或者如何优化此类业务?

业务场景为每插入一张订单,就要关联更新100条数据。
比如插入 100002XX 的订单(订单编号有并发情况,某一时刻可能会有多人插入该编号),每插入一张,在都要更新 10000200 至 10000299 的数据累计+ 1。(实际情况有其他字段的运算)

现在我使用的架构是mysql+redis。在mysql插入一条订单的时候,就添加1个的队列。(为解决数据同步问题,只能使用单进程)把 10000200 至 10000299 的相关字段都保存在redis。把然后使用redis的管道 pipeline 把 10000200 到 10000299 逐个incrBy累加。

但是这样效率不行,若同时有1000个订单入库,这样至少得更新(1000* 100)次redis(单线程),请问这样业务需求,该如何优化?或者有什么数据库能适合这种场景吗?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 20

试试雪花算法,跟机器和机器时间有关,只要时间不坏就没问题

8个月前 评论
Xiaoxiaoww (楼主) 8个月前
33qis (作者) 8个月前

我的理解是,每插入一条订单,去 redis 拿一个号,然后更新相关的几百条数据

两个方案:

1、从 redis 取到号之后,扔到队列去更新,这样不会阻塞后面的请求,反正此时订单号已经确定,不会重复
2、把取到号的订单写进另一个 redis set,部署一个定时任务,具体执行周期看业务情况,定时取出 set 的订单号,然后进行批量更新相关的几百条数据。

8个月前 评论
Xiaoxiaoww (楼主) 8个月前
MArtian (作者) 8个月前
Xiaoxiaoww (楼主) 8个月前
Xiaoxiaoww (楼主) 8个月前
MArtian (作者) 8个月前
Imuyu 8个月前
Xiaoxiaoww (楼主) 8个月前
Xiaoxiaoww (楼主) 8个月前
meows 8个月前
MArtian (作者) 8个月前
aodaobi

file

8个月前 评论
sanders

不太清楚为何要单进程?关联100条数据做单纯的累加的话,一个 update 就可以搞定,若是怕中间出错导致数据不一致性,可以使用事务。1000 个订单这种量级的写入并发我确实没有碰到过,但我理解使用集群配合队列削峰填谷,应该是可以消化的。

8个月前 评论
Xiaoxiaoww (楼主) 8个月前

为解决数据同步问题,只能使用单进程

一个分布式锁就能解决的问题,什么单线程多线程的问题,又不是需要状态的请求接口数据。 就这点数据流 mysql 扛起来都没问题,加个 redis 上把锁,安心睡觉就行了。 其次更新数据库怎么就不能放进队列了?队列本来就是一个正序的 list 结构,队列开个 32 线程跑,跑不过么?

本来很简单的诉求,就是保证数据能顺序的更新,唯一加的要求就是保证是顺序递增的,怎么就被整的这么麻烦呢?

8个月前 评论
Xiaoxiaoww (楼主) 8个月前
meows 8个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!