高并發(fā)下如何生成唯一訂單號?:互聯網快速發(fā)展的今天,各類商城平臺不計其數,商城及支付平臺都有訂單系統(tǒng),訂單系統(tǒng)里有一個關鍵元素就是訂單號,訂單號要具備:
互聯網快速發(fā)展的今天,各類商城平臺不計其數,商城及支付平臺都有訂單系統(tǒng),訂單系統(tǒng)里有一個關鍵元素就是訂單號,訂單號要具備全局唯一性。另外一方面,在分布式系統(tǒng)中也需要各種各樣的ID,同樣要求全局唯一性。
在一般項目中,我們要生成訂單號可選的方案很多,比如說:
1、數據庫自增長ID
優(yōu)點:借助數據庫實現,無需代碼實現;
缺點:不能做水平分表,因為ID可能會重復;高并發(fā)場景下生成效率低速度慢;
2、時間戳 + 隨機數
優(yōu)點:實現起來簡單
缺點:即使在相同的時間戳下隨機數依舊存在重復的可能
3、會員ID + 時間戳
優(yōu)點:同一時間內,同個用戶不會存在兩個訂單號
缺點:會員ID泄露,存在一定風險
4、GUID、UUID
優(yōu)點:簡單
缺點:生成的訂單號不友好、索引效率低下
所謂的高并發(fā)是指在較短時間段內服務器需要并行處理的請求數很多。在高并發(fā)場景下,同一秒可能會生成很多訂單號,這樣一來訂單號就存在重復的可能性。
另外一方面,如果是多線程或者分布式環(huán)境下同一秒生成的重復訂單可能性更大!
1、利用Redis原子遞增來實現(推薦)
因為Redis本身就是單線程的,再借助其原子操作INCR、INCRBY完全可以生成全局唯一的ID,而且速度快。
2、時間戳 + 多個隨機數 + 樂觀鎖
3、GUID轉換為數字
以上就是我的觀點,對于這個問題大家是怎么看待的呢?歡迎在下方評論區(qū)交流 ~ 我是科技領域創(chuàng)作者,十年互聯網從業(yè)經驗,歡迎關注我了解更多科技知識!
高并發(fā)下如何生成唯一訂單號(唯一主鍵),有幾個方案和大家分享一下。
先說最笨的方法,利用數據庫的自增長序列生成,數據庫內唯一;數據庫生成唯一主鍵,別的系統(tǒng)過來。
優(yōu)點:理解起來最容易,用起來也最容易。
缺點:也非常明顯了,每種數據庫的實現不同,如果數據庫需要遷移的話比較麻煩;最大的問題是性能問題,因為題目中提到了【高并發(fā)下】,所以使用這個方法估計會很難滿足性能需求。
Redis的單線程的,利用incr和increby;MongoDB的ObjectId;ZK通過znode數據版本;都可以生成全局的唯一標識碼。
優(yōu)點:性能高于數據庫;可以使用集群部署。
缺點:需要引入對應的組件,增加系統(tǒng)的復雜度。
這個是分布式架構中,生成唯一標識碼最常用的算法。UUID有基于MAC地址的,加上時間和時鐘序列的,也有基于偽隨機數的,基于加密哈希的。
優(yōu)點:本地生成,不需要第三方組件,生成比較簡單,性能好。
缺點:長度長,不利于存儲,并且沒有排序,是個字符串,不利于查詢。解決無序問題,可參考Comb算法(combined guid/timestamp)。
Twitter開源,基于zk,41位時間戳(毫秒數)+10位機器的ID+12位毫秒內的流水號+1位符號位(永遠是0)。
優(yōu)點:性能不錯,單機內遞增。
缺點:依賴zk;依賴于機器時鐘,分布式環(huán)境內可能會不是全局遞增。
百度開源,基于snowflake算法。
美團開源。
優(yōu)點:能保證全局唯一性、高可用、趨勢遞增(不太安全,比如泄露公司訂單數量)、單調遞增等。
缺點:依然會依賴第三方組件,zk或數據庫。
1、UUID
2、數據庫自增
3、Snowflake
4、Redis
這種方式比較方便,有現成可用的JAR包,但是也有缺點:ID可讀性不好,而且會造成索引樹頻繁頁分裂,影響數據庫性能和空間使用
維護一張序列表?紤]到性能問題,不必每次生成ID都去操作數據庫,可以設置一定的步長比如1000,每次從表中拿1000個序列號,從每臺服務器內存中線性去取
維護一個序列號鍵值對,利用Redis自增的原子性,生成序列號
同一毫秒可以產生ID數量4194304個,優(yōu)點是完全內存操作性能好,缺點是依賴于系統(tǒng)時鐘一致性。如果某臺機器的系統(tǒng)時鐘回撥,有可能造成ID沖突,或者ID亂序
最重要的還是根據項目的場景,尤其是并發(fā)量,選擇最合適的方法
請點擊關注按鈕【IT徐胖子】會持續(xù)為大家奉獻互聯網和技術干貨內容,感謝支持
由于是高并發(fā)情況,所以不建議使用數據庫自增ID,可以參考如下方案:
1、redis自增id
2、UUID
3、時間戳+隨機數
4、Twitter的snowflake算法
5、利用zookeeper生成唯一id,性能不如redis
6、MongoDB的ObjectId,和snowflake算法類似
雪花算法足夠了。我這邊兩個業(yè)務線都是用的雪花算法 完全能保證唯一。
華裔女賭王就此沒落,生前讓所有 濃情端午粽飄香,青浦邀你“云體 上海:“云端”展現端午節(jié)文化內 “甜咸大戰(zhàn)”!明星藝人們喜歡什 如何做一個男人喜歡的情人(如何 當你和你同時出現在同一個場景中 如何在昏暗的光線下設置快門速度 教育在生活中的價值是什么? 世上做壞事的人死后會面臨什么因 拜登就任總統(tǒng)后的第一步是什么? 同意/不同意:人生最重要的目標 二戰(zhàn)后,德國在調和分歧方面做得 亞伯·林肯恨白人嗎? 一個編輯能把你的故事毀得有多嚴 現在的iPhone6還能堅持再用一年 曹操為什么不殺司馬懿? 現在買房是不是最便宜的時候,現 我身邊的農業(yè)銀行營業(yè)廳關了,AT 歐洲媒體評選CBA最有實力球員, 榮耀play的6+128和榮耀8X的6+128 螞蟻集團是科技公司還是金融公司 請問機友華為mate30P與華為mate3 聽說老詹修剪一次指甲需要5小時 為什么說寶寶“一月睡二月哭三月 戴笠人稱戴老板,這個是怎么叫出 沒有工作能一次性補繳社保么? 我想知道定向師范生和免費師范生 肺癌引起的咳嗽是怎樣的呢? 5000mAh電池的5G手機推薦嗎?要 恒大亞冠表現“差強人意”,你覺