为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
浮云间 2019-03-15 05:25:11
目前用的是这个办法生成的唯一订单号 date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT); 最近发现会出现重复的,造成异常 然后我想用自增ID做,这样的话就不会有重复了 在用户提交订单时,先查询当前id数,然后缓存,如果没有缓存先缓存,有缓存就直接在缓存里拿到这个ID再生成订单号 这样做对效率有影响吗?还是有其他什么更好的办法
查看完整描述

9 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

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

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

查看完整回答
反对 回复 2019-03-18
?
潇湘沐

TA贡献1816条经验 获得超6个赞

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

查看完整回答
反对 回复 2019-03-18
?
函数式编程

TA贡献1807条经验 获得超9个赞

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

查看完整回答
反对 回复 2019-03-18
?
翻阅古今

TA贡献1780条经验 获得超5个赞

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

查看完整回答
反对 回复 2019-03-18
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

使用redis计数器或者uuid.

查看完整回答
反对 回复 2019-03-18
?
万千封印

TA贡献1891条经验 获得超3个赞

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

查看完整回答
反对 回复 2019-03-18
  • 9 回答
  • 0 关注
  • 586 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信