之所以发这个帖子是因为之前在项目中用的生成随机流水号的工具类有问题,出现了重号,比如订单1的订单号是123,订单2的订单号也是123。
所使用的生成随机号码的规则为:类别(比如OD)+年月日时分秒+随机3位数字
可是我感觉随机这东西就是在碰运气啊,就算我加上毫秒,也有可能出现重号,毕竟3位数字太少,加多几位数字也一样,于事无补。
我能想到的解决方法如下:
1、UUID,可是32位太长了,用不上啊……
2、每次生成订单号后查一下数据库是否已经有该订单号,有的话则重新生成,这个感觉不靠谱,太慢了……
3、创建一个编号表,使用主键作为订单编号的一部分,因为主键自增是唯一的,可是用这个的话将来一旦量大了,那订单编号的位数就会越来越大,无法控制了
其他的方法没有想到更好的了,希望前辈们可以指导一下如何解决。
以下要素视情况组合
•日期
•秒数/毫秒数
•机器hash(不同机器不重复)
•PID(不同进程不重复)
•用户ID
•db自增(性能较差)
•redis自增(性能不错,需要redis,有故障风险)
•类似mongodb的“单进程单秒内”的自增(性能最高)
另外,db/redis自增均可考虑跳步&缓存来降低压力(每次自增10/50/100回来后缓存在本地,本地的用完再去拿)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。