关于高并发下生成订单唯一流水号的方法-问答-阿里云开发者社区-阿里云

开发者社区> 蛮大人123> 正文

关于高并发下生成订单唯一流水号的方法

2016-02-25 16:42:18 7336 2

之所以发这个帖子是因为之前在项目中用的生成随机流水号的工具类有问题,出现了重号,比如订单1的订单号是123,订单2的订单号也是123。
所使用的生成随机号码的规则为:类别(比如OD)+年月日时分秒+随机3位数字
可是我感觉随机这东西就是在碰运气啊,就算我加上毫秒,也有可能出现重号,毕竟3位数字太少,加多几位数字也一样,于事无补。
我能想到的解决方法如下:
1、UUID,可是32位太长了,用不上啊……
2、每次生成订单号后查一下数据库是否已经有该订单号,有的话则重新生成,这个感觉不靠谱,太慢了……
3、创建一个编号表,使用主键作为订单编号的一部分,因为主键自增是唯一的,可是用这个的话将来一旦量大了,那订单编号的位数就会越来越大,无法控制了
其他的方法没有想到更好的了,希望前辈们可以指导一下如何解决。

取消 提交回答
全部回答(2)
  • 老k868
    2019-07-23 23:19:53
    1. 如果没有并发,订单号只在一个线程内产生,那么由于程序是顺序执行的,不同订单的生成时间一定不同,因此用时间就可以区分各个订单。
    2. 如果存在并发,且订单号是由一个进程中的多个线程产生的,那么只要把线程ID添加到序列号中就可以保证订单号唯一。
    3. 如果存在并发,且订单号是由同一台主机中的多个进程产生的,那么只要把进程ID添加到序列号中就可以保证订单号唯一。
    4. 如果存在并发,且订单号是由不同台主机产生的,那么MAC地址、IP地址或CPU序列号等能够区分主机的号码添加到序列号中就可以保证订单号唯一。
    0 0
  • 蛮大人123
    2019-07-17 18:47:40

    以下要素视情况组合
    •日期
    •秒数/毫秒数
    •机器hash(不同机器不重复)
    •PID(不同进程不重复)
    •用户ID
    •db自增(性能较差)
    •redis自增(性能不错,需要redis,有故障风险)
    •类似mongodb的“单进程单秒内”的自增(性能最高)
    另外,db/redis自增均可考虑跳步&缓存来降低压力(每次自增10/50/100回来后缓存在本地,本地的用完再去拿)

    1 0
添加回答
相关问答

17

回答

【大咖问答】对话PostgreSQL 中国社区发起人之一,阿里云数据库高级专家 德哥

阿里ACE 彭飞 2019-07-10 09:36:10 961485浏览量 回答数 17

145

回答

【新手入门】云服务器linux使用手册

fanyue88888 2012-11-26 17:14:18 157032浏览量 回答数 145

8

回答

OceanBase 使用动画(持续更新)

mq4096 2019-02-20 17:16:36 333775浏览量 回答数 8

22

回答

爬虫数据管理【问答合集】

我是管理员 2018-08-10 16:37:41 146738浏览量 回答数 22

3

回答

请问postgres实时同步数据到mysql数据库有什么好的方案吗?

toni3 2019-06-29 14:55:43 115759浏览量 回答数 3

2

回答

mySQL数据库报错You have an error in your SQL syntax

落地花开啦 2016-02-14 16:09:24 126023浏览量 回答数 2

38

回答

安全组详解,新手必看教程

我的中国 2017-11-30 15:23:46 256820浏览量 回答数 38

21

回答

请教一下数据量有100万条左右要什么配置?

易网网络 2013-03-27 15:18:02 192303浏览量 回答数 21

78

回答

【2013.9.5修正版图文】新手如何使用阿里云(linux)服务器建站(搬站)

姑苏公子 2013-04-11 00:39:13 107720浏览量 回答数 78

103

回答

云虚拟主机使用教程完整版!!

梦丫头 2015-08-08 13:12:33 107328浏览量 回答数 103
+关注
蛮大人123
我说我不帅他们就打我,还说我虚伪
0
文章
7733
问答
问答排行榜
最热
最新
推荐问答
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载