废话少说,直接切入主题!
场景:每天新增订单数量在百万级,订单表分库分表存放。订单号必须是数字。
方案一:业务号+年(年份后两位)+月+日+订单数。核心逻辑,新建一张订单表维护每天的订单新增数量,生成订单时,从表中查询到订单数,组合上面的其他几项行成新的订单号码。
方案二:新建一张全局订单表,存放一个自增的id字段,每次生成订单号时候,在全局订单表中插入一条记录,使用id作为新订单的订单号。
以上两中方案都能解决在分库分表的情况下保证订单号的唯一性,但是每次生成订单号的时候都需要去一张表中插入(更新)一条记录。在高并发下会存在性能瓶颈问题。
方案三:在方案二的基础上修改。使用100(table_num)张表作为订单号生成表。根据一定规则,去其中一张表中去生成一个订单号。比如:根据用户id(uid)和表数量取模得到目标表。然后在目标表中插入一条记录得到自增长的id将得到这个id*表的数量+(用户id%表数量)得到最终的订单号。order_no = (uid % tale_num) * table_num + (uid % table_num)。有点,将单表的操作分散到多张表中,提高了系统的并发能力。