{eval=Array;=+count(Array);}

国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

問答專欄Q & A COLUMN

高并發下如何生成唯一訂單號?

sunnyxdsunnyxd 回答0 收藏2
收藏問題

10條回答

worldligang

worldligang

回答于2022-06-28 15:43

互聯網架構


分布式/集群環境ID生成要求

  1. 全局唯一
  2. 高并發支持
  3. 高可用
  4. 趨勢遞增
  5. 信息安全
  6. 可讀性

ID 生成策略

1、UUID

  1. 通用唯一識別碼
  2. 組成: 當前日期 + 時間 + 時鐘序列 + 機器識別碼(MAC地址或其他)
  3. 在分布式系統中,所有元素都不需要通過中央控制端來 判斷數據的唯一性

2、數據庫自增

  • 關系型數據庫都實現數據庫自增ID;Mysql通過AUTO_INCREMENT實現、Oracle通過Sequence序列實現。
  • 在數據集群環境下,不同數據庫節點可設置不同起步值、相同步長來實現集群下生成全局唯一、遞增ID
  • SET GLOBAL auto_increment_increment = 3
  • SET GLOBAL auto_increment_offset = 1;


3、Snowflake

  • 41位時間戳+10位機器ID +12位序列號(自增),轉換為長度為18的長整型
  • Twitter為滿足每秒上萬條消息的創建,每條消息都必須分配全局唯一ID,這些ID需要趨勢遞增,方便客戶端排序。


4、Redis

  • Redis 實現自增ID
  • Redis實現了incr(key) API用于將key 的值遞增1,并返回結果,如果key不存在,則創建并賦值為0,然后再執行incr操作。

幾種策略總結


評論0 贊同0
  •  加載中...
lewinlee

lewinlee

回答于2022-06-28 15:43

生成全局唯一ID有以下幾種方式:

時間戳+用戶ID+隨機數

這其實并不是真正意義上的全局唯一ID,但是在并發量不高的場景中已經夠用了。其中時間戳可以是毫秒級別

UUID

這種方式比較方便,有現成可用的JAR包,但是也有缺點:ID可讀性不好,而且會造成索引樹頻繁頁分裂,影響數據庫性能和空間使用


數據庫序列表

維護一張序列表。考慮到性能問題,不必每次生成ID都去操作數據庫,可以設置一定的步長比如1000,每次從表中拿1000個序列號,從每臺服務器內存中線性去取


Redis

維護一個序列號鍵值對,利用Redis自增的原子性,生成序列號


Snowflake

同一毫秒可以產生ID數量4194304個,優點是完全內存操作性能好,缺點是依賴于系統時鐘一致性。如果某臺機器的系統時鐘回撥,有可能造成ID沖突,或者ID亂序


總結

最重要的還是根據項目的場景,尤其是并發量,選擇最合適的方法


敬請關注

請點擊關注按鈕【IT徐胖子】會持續為大家奉獻互聯網和技術干貨內容,感謝支持

評論0 贊同0
  •  加載中...
fxp

fxp

回答于2022-06-28 15:43

由于是高并發情況,所以不建議使用數據庫自增ID,可以參考如下方案:

1、redis自增id

2、UUID

3、時間戳+隨機數

4、Twitter的snowflake算法

5、利用zookeeper生成唯一id,性能不如redis

6、MongoDB的ObjectId,和snowflake算法類似

評論0 贊同0
  •  加載中...
cheukyin

cheukyin

回答于2022-06-28 15:43

雪花算法足夠了。我這邊兩個業務線都是用的雪花算法 完全能保證唯一。

評論0 贊同0
  •  加載中...
neroneroffy

neroneroffy

回答于2022-06-28 15:43

隨便哪個程序員都可以寫出來一個生成訂單的算法,除了美團、淘寶這種需要考慮訂單重復,大多數企業還是發愁沒有訂單的狀態,需要考慮這個問題的企業應該不差錢了,希望我的公司有機會讓我來解決這個問題。

評論0 贊同0
  •  加載中...
leeon

leeon

回答于2022-06-28 15:43

1:獲取當前日期作為訂單號的前8位

2:獲取uuid,它是通用唯一識別碼,進行hashcode轉碼仍然可以保證其唯一性,可以取12位

3:日期和uuid轉碼之后的12位拼接,一共20位,可以生成唯一訂單號

評論0 贊同0
  •  加載中...
zxhaaa

zxhaaa

回答于2022-06-28 15:43

最簡單的辦法就是用用戶名?ip?時間生成訂單號,然后計算哈希值后做一定轉換就可以生成唯一訂單號。不過唯一的問題就是不太好查。畢竟這種訂單號沒有任何規律可言,后期查詢是個大麻煩。其實最建議的方式就是分渠道分地區建立訂單號。就和身份證號生成機制一樣,各個地區可以獨立生成身份證號,最后合在一起還沒有任何問題。

評論0 贊同0
  •  加載中...
animabear

animabear

回答于2022-06-28 15:43

用算法呀。對訂單這種,很簡單。

商品id +用戶id+時間戳+隨機數+自增數

就能保證唯一性。現實中,沒哪個用戶去高并發下單(除非bug)。

評論0 贊同0
  •  加載中...
2501207950

2501207950

回答于2022-06-28 15:43

雪花算法 有開源實現

評論0 贊同0
  •  加載中...
jonh_felix

jonh_felix

回答于2022-06-28 15:43

看一下美團的leaf

https://tech.meituan.com/2019/03/07/open-source-project-leaf.html

評論0 贊同0
  •  加載中...

相關問題

最新活動

您已邀請0人回答 查看邀請

我的邀請列表

  • 擅長該話題
  • 回答過該話題
  • 我關注的人
向幫助了您的網友說句感謝的話吧!
付費偷看金額在0.1-10元之間
<