【求助】这段php方法,生成唯一的订单号会有重复的,该如何避免?

代码如下

function OrderId(){
    mt_srand((double) microtime() * 1000000);
    return date('ymd').str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
}

生成出来的如19053099888,前面是日期,实际随机的数字只有5位,但是会有重复的情况出现,该如何避免呢?

阅读 4.5k
7 个回答
date('YmdHis').mt_rand(1e4,1e5-1).uniqid();

in_array 比较耗性能,看看就好。

clipboard.png

如果想keep simple,不想搞太长的号,那就加个retry机制,生成后,查一下是不是重了, 重了就再生成一次。只有retry比例不高,就可以。

1、如果订单号可以使用任一规则,则可以使用uuid、或者其他方法;
2、如果非要用日期格式+随机数,订单号生成之后可以在数据库里判断一下保证唯一;

去了解一下Twitter雪花算法SnowFlake算法

现在订单的基础前缀是到天,如果想简单点,在redis以日期存一个缓存,每次生成的时候自增,过期时间为1天。因为redis自增操作是原子操作,肯定不会重复

1.时间戳加随机数
2.时间戳加用户id
3.时间戳加uuid

订单号可以用 用户id加时间戳+随机数 表示某个用户在某一秒下的单 这个一般不会重复,重复了就说明有人在恶意刷单哦

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