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

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

問(wèn)答專欄Q & A COLUMN

高并發(fā)下如何生成唯一訂單號(hào)?

sunnyxdsunnyxd 回答0 收藏2
收藏問(wèn)題

10條回答

worldligang

worldligang

回答于2022-06-28 15:43

互聯(lián)網(wǎng)架構(gòu)


分布式/集群環(huán)境ID生成要求

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

ID 生成策略

1、UUID

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

2、數(shù)據(jù)庫(kù)自增

  • 關(guān)系型數(shù)據(jù)庫(kù)都實(shí)現(xiàn)數(shù)據(jù)庫(kù)自增ID;Mysql通過(guò)AUTO_INCREMENT實(shí)現(xiàn)、Oracle通過(guò)Sequence序列實(shí)現(xiàn)。
  • 在數(shù)據(jù)集群環(huán)境下,不同數(shù)據(jù)庫(kù)節(jié)點(diǎn)可設(shè)置不同起步值、相同步長(zhǎng)來(lái)實(shí)現(xiàn)集群下生成全局唯一、遞增ID
  • SET GLOBAL auto_increment_increment = 3
  • SET GLOBAL auto_increment_offset = 1;


3、Snowflake

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


4、Redis

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

幾種策略總結(jié)


評(píng)論0 贊同0
  •  加載中...
lewinlee

lewinlee

回答于2022-06-28 15:43

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

時(shí)間戳+用戶ID+隨機(jī)數(shù)

這其實(shí)并不是真正意義上的全局唯一ID,但是在并發(fā)量不高的場(chǎng)景中已經(jīng)夠用了。其中時(shí)間戳可以是毫秒級(jí)別

UUID

這種方式比較方便,有現(xiàn)成可用的JAR包,但是也有缺點(diǎn):ID可讀性不好,而且會(huì)造成索引樹頻繁頁(yè)分裂,影響數(shù)據(jù)庫(kù)性能和空間使用


數(shù)據(jù)庫(kù)序列表

維護(hù)一張序列表??紤]到性能問(wèn)題,不必每次生成ID都去操作數(shù)據(jù)庫(kù),可以設(shè)置一定的步長(zhǎng)比如1000,每次從表中拿1000個(gè)序列號(hào),從每臺(tái)服務(wù)器內(nèi)存中線性去取


Redis

維護(hù)一個(gè)序列號(hào)鍵值對(duì),利用Redis自增的原子性,生成序列號(hào)


Snowflake

同一毫秒可以產(chǎn)生ID數(shù)量4194304個(gè),優(yōu)點(diǎn)是完全內(nèi)存操作性能好,缺點(diǎn)是依賴于系統(tǒng)時(shí)鐘一致性。如果某臺(tái)機(jī)器的系統(tǒng)時(shí)鐘回?fù)埽锌赡茉斐蒊D沖突,或者ID亂序


總結(jié)

最重要的還是根據(jù)項(xiàng)目的場(chǎng)景,尤其是并發(fā)量,選擇最合適的方法


敬請(qǐng)關(guān)注

請(qǐng)點(diǎn)擊關(guān)注按鈕【IT徐胖子】會(huì)持續(xù)為大家奉獻(xiàn)互聯(lián)網(wǎng)和技術(shù)干貨內(nèi)容,感謝支持

評(píng)論0 贊同0
  •  加載中...
fxp

fxp

回答于2022-06-28 15:43

由于是高并發(fā)情況,所以不建議使用數(shù)據(jù)庫(kù)自增ID,可以參考如下方案:

1、redis自增id

2、UUID

3、時(shí)間戳+隨機(jī)數(shù)

4、Twitter的snowflake算法

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

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

評(píng)論0 贊同0
  •  加載中...
cheukyin

cheukyin

回答于2022-06-28 15:43

雪花算法足夠了。我這邊兩個(gè)業(yè)務(wù)線都是用的雪花算法 完全能保證唯一。

評(píng)論0 贊同0
  •  加載中...
neroneroffy

neroneroffy

回答于2022-06-28 15:43

隨便哪個(gè)程序員都可以寫出來(lái)一個(gè)生成訂單的算法,除了美團(tuán)、淘寶這種需要考慮訂單重復(fù),大多數(shù)企業(yè)還是發(fā)愁沒有訂單的狀態(tài),需要考慮這個(gè)問(wèn)題的企業(yè)應(yīng)該不差錢了,希望我的公司有機(jī)會(huì)讓我來(lái)解決這個(gè)問(wèn)題。

評(píng)論0 贊同0
  •  加載中...
leeon

leeon

回答于2022-06-28 15:43

1:獲取當(dāng)前日期作為訂單號(hào)的前8位

2:獲取uuid,它是通用唯一識(shí)別碼,進(jìn)行hashcode轉(zhuǎn)碼仍然可以保證其唯一性,可以取12位

3:日期和uuid轉(zhuǎn)碼之后的12位拼接,一共20位,可以生成唯一訂單號(hào)

評(píng)論0 贊同0
  •  加載中...
zxhaaa

zxhaaa

回答于2022-06-28 15:43

最簡(jiǎn)單的辦法就是用用戶名?ip?時(shí)間生成訂單號(hào),然后計(jì)算哈希值后做一定轉(zhuǎn)換就可以生成唯一訂單號(hào)。不過(guò)唯一的問(wèn)題就是不太好查。畢竟這種訂單號(hào)沒有任何規(guī)律可言,后期查詢是個(gè)大麻煩。其實(shí)最建議的方式就是分渠道分地區(qū)建立訂單號(hào)。就和身份證號(hào)生成機(jī)制一樣,各個(gè)地區(qū)可以獨(dú)立生成身份證號(hào),最后合在一起還沒有任何問(wèn)題。

評(píng)論0 贊同0
  •  加載中...
animabear

animabear

回答于2022-06-28 15:43

用算法呀。對(duì)訂單這種,很簡(jiǎn)單。

商品id +用戶id+時(shí)間戳+隨機(jī)數(shù)+自增數(shù)

就能保證唯一性?,F(xiàn)實(shí)中,沒哪個(gè)用戶去高并發(fā)下單(除非bug)。

評(píng)論0 贊同0
  •  加載中...
2501207950

2501207950

回答于2022-06-28 15:43

雪花算法 有開源實(shí)現(xiàn)

評(píng)論0 贊同0
  •  加載中...
jonh_felix

jonh_felix

回答于2022-06-28 15:43

看一下美團(tuán)的leaf

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

評(píng)論0 贊同0
  •  加載中...

最新活動(dòng)

您已邀請(qǐng)0人回答 查看邀請(qǐng)

我的邀請(qǐng)列表

  • 擅長(zhǎng)該話題
  • 回答過(guò)該話題
  • 我關(guān)注的人
向幫助了您的網(wǎng)友說(shuō)句感謝的話吧!
付費(fèi)偷看金額在0.1-10元之間
<