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

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

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

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

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

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

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

阅读 5.3k
9 个回答

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

同一天里的单子靠不到 100K 的随机数分配?天哪,怎么想的?
略微有丢丢常识的都知道最常用的 ID 分配就是数字递增吧?
总觉得如今的 PHP 问题是越来越水了。。。

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

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

可以用redis的id生成器

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

使用redis计数器或者uuid.

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

方法很多,比如加个iplong进去都可以极大减少重复,这样还可以用来根据ip统计分析,办法总比问题多

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