php生成唯一订单利用数据库ID自增放缓存里,然后加在订单号上可行吗

目前用的是这个办法生成的唯一订单号

date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);

最近发现会出现重复的,造成异常

然后我想用自增ID做,这样的话就不会有重复了

在用户提交订单时,先查询当前id数,然后缓存,如果没有缓存先缓存,有缓存就直接在缓存里拿到这个ID再生成订单号

这样做对效率有影响吗?
还是有其他什么更好的办法

浮云间
浏览 587回答 9
9回答

蝴蝶不菲

date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT); 同一天里的单子靠不到 100K 的随机数分配?天哪,怎么想的?略微有丢丢常识的都知道最常用的 ID 分配就是数字递增吧?总觉得如今的 PHP 问题是越来越水了。。。

潇湘沐

千万不要用递增,bug我不会告诉你的

函数式编程

时间加到His,基本就不会重复了

翻阅古今

精确到年月日时分秒毫秒然后再拼接str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);这样控制在一毫秒内,重复的概率就大大缩小了

猛跑小猪

使用redis计数器或者uuid.

万千封印

自增ID不是唯一办法,当你要分表后还保留订单对其他的唯一关联,自增ID就无用了,因为每个分表都有自增。ID这个东西不局限于INT的,因为它不展示给用户。可以用 sha1(uniqid('d', true)) 这种唯一字符串来保证。生成订单号就用另一个方法,不用拼接的。年月日时分秒这种实际是很容易重复的。发表下个人看法。(逃)
打开App,查看更多内容
随时随地看视频慕课网APP