比如订单号:JY202003200021
代表的是 20200220第21笔订单
假设生成单号的时候临时去 count table 统计订单数,必定会造成数据库锁死的问题,因为查询条件复杂,要筛选时间+商家编号。这种方案铁定不行
那我该如何保证单号唯一性而又不影响数据库呢?我可以允许有时候某个单号和实际笔数对不上。
我生成这种格式的单号主要是为了方便用户沟通的时候说单号,比如用雪花算法这种的方式生成的话,单号太长了,客服和客服沟通一下某某单号出问题,要是拿嘴巴说的话,报单号都得报死人。。。。。
如果一定要当前年月日+当天订单笔数这种格式,为了不查数据库,可以考虑把每天的订单数量用redis计数,直接从redis里获取数量, key为每一天日期,例如 order_count_20200321
谢谢回复。
如果这么一来,有一个新的问题出现,会不会存在某笔订单号生成成功了,redis计数失败了。然后导致了下笔订单号与当前订单号重复呢?所以这里面是不是又得有一个东西,大概就是保证事务的一致性。
@LoveCoder: 要使用订单笔数来作为订单号,那就得保持一致性
订单号带时间标识是可以的 但是你后面的21 想带上比较困难,在高并发的情况下 这个很容易失控 如果是订单号 可以看看这篇博客https://www.cnblogs.com/zhou-920644981/p/12202391.html
如果是为了报单号方便,可以在最后增加n个随机字符
服务端可以按照这个随机字符查询
这样大概率会匹配到, 重复的二次确认一下就行。