怎样保证生成10位唯一订单号?

订单号规则
第1位随机1-9;
第2位,我自己在程序中根据业务指定;1,2,3,4,5,6,7,8,9
剩下的3-10位都随机。
怎样保证唯一性呢?

我有一个办法,就是每次生成之前,先随机一把,然后去订单表里面查一下是否有重复的,有就再随机一把,再查,直到没有一样的,然后在保存订单到数据库。

这种效果咋样,数据多了,是不是影响性能。订单表最多允许500万数据吧,用户20万。web金融业务,用户不是长期在线那种,每天每个用户也就平均登陆5次。

系统只保存最近3个月订单,多了就转移到一个历史数据里面,不让订单表无限扩大。

现在纠结的是这样做,会不会很影响性能?目前没更好的想法。

阅读 7k
4 个回答
//10位我感觉有点短
md5(md5(time().str_random(16) . session_create_id() . uniqid() . mt_rand(10000,99999)) . session_create_id())

``

会影响性能,因为你的查询次数不可预料。随着写入的订单数越来越多,生成的订单ID的冲突概率也越来越高
建议用时间戳+自增数字+随机数的方式来填充剩下的3~10位,类似于Snowflake算法的思路

业务编号1-9 + 时间戳 + 用户id
一个用户在某个业务某一秒内只能一下一单,并且不会出现重复

最好就是不要随机,要制定一个规则。
第一位代表什么,后面几位代表什么,并且保证新订单号有某种形式的自增来避免重复。
可以搜一下订单号的生成规则,会有些启发的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题