鍍金池/ 問答/Java  PHP/ php生成唯一訂單利用數(shù)據庫ID自增放緩存里,然后加在訂單號上可行嗎

php生成唯一訂單利用數(shù)據庫ID自增放緩存里,然后加在訂單號上可行嗎

目前用的是這個辦法生成的唯一訂單號

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

最近發(fā)現(xiàn)會出現(xiàn)重復的,造成異常

然后我想用自增ID做,這樣的話就不會有重復了

在用戶提交訂單時,先查詢當前id數(shù),然后緩存,如果沒有緩存先緩存,有緩存就直接在緩存里拿到這個ID再生成訂單號

這樣做對效率有影響嗎?
還是有其他什么更好的辦法

回答
編輯回答
冷咖啡

千萬不要用遞增,bug我不會告訴你的

2018年7月26日 19:50
編輯回答
久愛她

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

同一天里的單子靠不到 100K 的隨機數(shù)分配?天哪,怎么想的?
略微有丟丟常識的都知道最常用的 ID 分配就是數(shù)字遞增吧?
總覺得如今的 PHP 問題是越來越水了。。。

2018年4月11日 11:01
編輯回答
莓森

使用 uuid

2017年9月11日 16:05
編輯回答
膽怯

使用redis計數(shù)器或者uuid.

2018年2月13日 18:42
編輯回答
我不懂

可以用redis的id生成器

2017年9月17日 00:07
編輯回答
過客

方法很多,比如加個iplong進去都可以極大減少重復,這樣還可以用來根據ip統(tǒng)計分析,辦法總比問題多

2017年12月16日 16:29
編輯回答
離魂曲

時間加到His,基本就不會重復了

2017年10月3日 04:56
編輯回答
拼未來

精確到年月日時分秒毫秒然后再拼接str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);這樣控制在一毫秒內,重復的概率就大大縮小了

2018年5月24日 20:50
編輯回答
青裙

自增ID不是唯一辦法,當你要分表后還保留訂單對其他的唯一關聯(lián),自增ID就無用了,因為每個分表都有自增。
ID這個東西不局限于INT的,因為它不展示給用戶??梢杂?sha1(uniqid('d', true)) 這種唯一字符串來保證。
生成訂單號就用另一個方法,不用拼接的。
年月日時分秒這種實際是很容易重復的。
發(fā)表下個人看法。(逃)

2018年7月27日 04:43