问题
今天系统突然出现订单号重复的问题,但通过日志观察,并没发现订单号有重复的(使用redis的incr生成),于是猜测可能是之前测试的时候用过这些订单号,但未支付的订单在商户上也查不到,所以最终只能通过代码的方式来处理。
处理
因为用的是第三方封装的微信支付jar,所以通过捕获其异常,如果是订单号重复,那么就重新生成订单号再次下单。
雪花算法
不过try-catch来处理,每次下单也是需要耗费时间的
于是参考了雪花算法,据说只要是时间不回溯,编号就不会重复,可以看看这篇文章,感觉还不错
一个long(64bit),由几部分组成
1bit(符号位)
41bit(毫秒数)
10bit(机器标识[机房id + 机器id 或跟业务相关的id])
12bit(序列号[如果1ms进入多个请求就根据这个来区别])
由上可知主导还是时间,只要时间不回去的话,重复的概率还是很低的,而且这个生成不依赖于数据库(我是依赖于redis),方便