唯一ID生成方案

一攒暇,唯一ID的特性:

  • 整個(gè)系統(tǒng)ID唯一

  • ID是數(shù)字類型曹傀,而且是趨勢(shì)遞增的

  • ID簡(jiǎn)短,查詢效率快

什么是遞增狭莱?

如:第一次生成的ID為12僵娃,下一次生成的ID是13,再下一次生成的ID是14腋妙。這個(gè)就是生成ID遞增默怨。

什么是趨勢(shì)遞增?

如:在一段時(shí)間內(nèi)辉阶,生成的ID是遞增的趨勢(shì)先壕。如:再一段時(shí)間內(nèi)生成的ID在【0瘩扼,1000】之間,過段時(shí)間生成的ID在【1000垃僚,2000】之間集绰。但在【0-1000】區(qū)間內(nèi)的時(shí)候,ID生成有可能第一次是12谆棺,第二次是10栽燕,第三次是14。

二改淑、分布式ID的幾種生成方案

2.1碍岔、UUID

這個(gè)方案是小伙伴們第一個(gè)能過考慮到的方案

優(yōu)點(diǎn):

  • 代碼實(shí)現(xiàn)簡(jiǎn)單。

  • 本機(jī)生成朵夏,沒有性能問題

  • 因?yàn)槭侨蛭ㄒ坏腎D蔼啦,所以遷移數(shù)據(jù)容易

缺點(diǎn):

  • 每次生成的ID是無序的,無法保證趨勢(shì)遞增

  • UUID的字符串存儲(chǔ)仰猖,查詢效率慢

  • 存儲(chǔ)空間大

  • ID本事無業(yè)務(wù)含義捏肢,不可讀

應(yīng)用場(chǎng)景:

  • 類似生成token令牌的場(chǎng)景

  • 不適用一些要求有趨勢(shì)遞增的ID場(chǎng)景

此UUID方案是不適用老顧的需求。

實(shí)現(xiàn)代碼

<pre xml:space="preserve" style="margin: 0px; padding: 0px; border: 0px; line-height: 1.57143em; font-family: Monaco, Courier, monospace; color: rgb(56, 56, 56); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">import java.util.UUID;

public class Uuid {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
//注意replaceAll前面的是正則表達(dá)式
String uuid = UUID.randomUUID().toString().replaceAll("-","");
System.out.println(uuid);
}
}
}</pre>

2.2饥侵、MySQL主鍵自增

這個(gè)方案就是利用了MySQL的主鍵自增auto_increment鸵赫,默認(rèn)每次ID加1。

優(yōu)點(diǎn):

  • 數(shù)字化躏升,id遞增

  • 查詢效率高

  • 具有一定的業(yè)務(wù)可讀

缺點(diǎn):

  • 存在單點(diǎn)問題辩棒,如果mysql掛了,就沒法生成iD了

  • 數(shù)據(jù)庫壓力大膨疏,高并發(fā)抗不住

2.3一睁、MySQL多實(shí)例主鍵自增

這個(gè)方案就是解決mysql的單點(diǎn)問題,在auto_increment基本上面佃却,設(shè)置step步長

[圖片上傳失敗...(image-b6deb9-1570518549756)]

每臺(tái)的初始值分別為1,2,3...N卖局,步長為N(這個(gè)案例步長為4)

優(yōu)點(diǎn):

  • 解決了單點(diǎn)問題

缺點(diǎn):

  • 一旦把步長定好后,就無法擴(kuò)容双霍;而且單個(gè)數(shù)據(jù)庫的壓力大,數(shù)據(jù)庫自身性能無法滿足高并發(fā)

應(yīng)用場(chǎng)景:

  • 數(shù)據(jù)不需要擴(kuò)容的場(chǎng)景

此方案也不滿足老顧的需求批销,因?yàn)椴环奖銛U(kuò)容(記住這個(gè)方案洒闸,嘿嘿)

2.4、雪花snowflake算法

這個(gè)算法網(wǎng)上介紹了很多均芽,老顧這里就不詳細(xì)介紹丘逸。雪花算法生成64位的二進(jìn)制正整數(shù),然后轉(zhuǎn)換成10進(jìn)制的數(shù)掀宋。64位二進(jìn)制數(shù)由如下部分組成:

ZQWVWR(APRT078LF3PER_R4.png
  • 1位標(biāo)識(shí)符:始終是0

  • 41位時(shí)間戳:41位時(shí)間截不是存儲(chǔ)當(dāng)前時(shí)間的時(shí)間截深纲,而是存儲(chǔ)時(shí)間截的差值(當(dāng)前時(shí)間截 - 開始時(shí)間截 )得到的值仲锄,這里的的開始時(shí)間截,一般是我們的id生成器開始使用的時(shí)間湃鹊,由我們程序來指定的

  • 10位機(jī)器標(biāo)識(shí)碼:可以部署在1024個(gè)節(jié)點(diǎn)儒喊,如果機(jī)器分機(jī)房(IDC)部署,這10位可以由 5位機(jī)房ID + 5位機(jī)器ID 組成

  • 12位序列:毫秒內(nèi)的計(jì)數(shù)币呵,12位的計(jì)數(shù)順序號(hào)支持每個(gè)節(jié)點(diǎn)每毫秒(同一機(jī)器怀愧,同一時(shí)間截)產(chǎn)生4096個(gè)ID序號(hào)

優(yōu)點(diǎn):

  • 此方案每秒能夠產(chǎn)生409.6萬個(gè)ID,性能快

  • 時(shí)間戳在高位余赢,自增序列在低位芯义,整個(gè)ID是趨勢(shì)遞增的,按照時(shí)間有序遞增

  • 靈活度高妻柒,可以根據(jù)業(yè)務(wù)需求扛拨,調(diào)整bit位的劃分,滿足不同的需求

缺點(diǎn):

  • 依賴機(jī)器的時(shí)鐘举塔,如果服務(wù)器時(shí)鐘回?fù)馨缶瑫?huì)導(dǎo)致重復(fù)ID生成

在分布式場(chǎng)景中,服務(wù)器時(shí)鐘回?fù)軙?huì)經(jīng)常遇到啤贩,一般存在10ms之間的回?fù)艽海恍』锇閭兙驼f這點(diǎn)10ms,很短可以不考慮吧痹屹。但此算法就是建立在毫秒級(jí)別的生成方案章郁,一旦回?fù)埽秃苡锌赡艽嬖谥貜?fù)ID志衍。

此方案暫不符合老顧的需求(嘿嘿暖庄,看看怎么優(yōu)化這個(gè)方案,小伙伴們先記茁シ尽)

2.5培廓、Redis生成方案

利用redis的incr原子性操作自增,一般算法為:

年份 + 當(dāng)天距當(dāng)年第多少天 + 天數(shù) + 小時(shí) + redis自增

優(yōu)點(diǎn):

  • 有序遞增春叫,可讀性強(qiáng)

缺點(diǎn):

  • 占用帶寬肩钠,每次要向redis進(jìn)行請(qǐng)求

整體測(cè)試了這個(gè)性能如下:

需求:同時(shí)10萬個(gè)請(qǐng)求獲取ID

1、并發(fā)執(zhí)行完耗時(shí):9s左右
2暂殖、單任務(wù)平均耗時(shí):74ms
3价匠、單線程最小耗時(shí):不到1ms
4、單線程最大耗時(shí):4.1s

性能還可以呛每,如果對(duì)性能要求不是太高的話踩窖,這個(gè)方案基本符合老顧的要求。

但不完全符合業(yè)務(wù)老顧希望id從 1 開始趨勢(shì)遞增晨横。(當(dāng)然算法可以調(diào)整為 就一個(gè) redis自增洋腮,不需要什么年份箫柳,多少天等)。

2.6啥供、小結(jié)

以上介紹了常見的幾種分布式ID生成方案悯恍。一線大廠的分布式ID方案絕沒有這個(gè)簡(jiǎn)單,他們對(duì)高并發(fā)滤灯,高可用的要求很高坪稽。

如Redis方案中,每次都要去Redis去請(qǐng)求鳞骤,有網(wǎng)絡(luò)請(qǐng)求耗時(shí)窒百,并發(fā)強(qiáng)依賴了Redis。這個(gè)設(shè)計(jì)是有風(fēng)險(xiǎn)的豫尽,一旦Redis掛了篙梢,整個(gè)系統(tǒng)不可用。

而且一線大廠也會(huì)考慮到ID安全性的問題美旧,如:Redis方案中渤滞,用戶是可以預(yù)測(cè)下一個(gè)ID號(hào)是多少,因?yàn)樗惴ㄊ沁f增的榴嗅。

這樣的話競(jìng)爭(zhēng)對(duì)手第一天中午12點(diǎn)下個(gè)訂單妄呕,就可以看到平臺(tái)的訂單ID是多少,第二天中午12點(diǎn)再下一單嗽测,又平臺(tái)訂單ID到多少绪励。這樣就可以猜到平臺(tái)1天能產(chǎn)生多少訂單了,這個(gè)是絕對(duì)不允許的唠粥,公司絕密啊疏魏。

三、一線大廠是如何設(shè)計(jì)的呢?

一線大廠的設(shè)計(jì)思路其實(shí)和小伙伴們思路差不多晤愧,只是多想了1~2層大莫,設(shè)計(jì)上面多了1~2個(gè)環(huán)節(jié)。

3.1官份、改造數(shù)據(jù)庫主鍵自增

上述我們介紹了利用數(shù)據(jù)庫的自增主鍵的特性只厘,可以實(shí)現(xiàn)分布式ID;這個(gè)ID比較簡(jiǎn)短明了舅巷,適合做userId懈凹,正好符合如何永不遷移數(shù)據(jù)和避免熱點(diǎn)? 根據(jù)服務(wù)器指標(biāo)分配數(shù)據(jù)量(揭秘篇)文章中的ID的需求。但這個(gè)方案有嚴(yán)重的問題:

  • 一旦步長定下來悄谐,不容易擴(kuò)容

  • 數(shù)據(jù)庫壓力山大

小伙伴們看看怎么優(yōu)化這個(gè)方案。先看數(shù)據(jù)庫壓力大库北,為什么壓力大爬舰?是因?yàn)槲覀兠看潍@取ID的時(shí)候们陆,都要去數(shù)據(jù)庫請(qǐng)求一次。那我們可以不可以不要每次去惹橐佟坪仇?

思路我們可以請(qǐng)求數(shù)據(jù)庫得到ID的時(shí)候,可設(shè)計(jì)成獲得的ID是一個(gè)ID區(qū)間段垃你。

![ZG_(BZ`6%OYJZDB3}CN4KJ.png

我們看上圖椅文,有張ID規(guī)則表:

1、id表示為主鍵惜颇,無業(yè)務(wù)含義皆刺。

2、biz_tag為了表示業(yè)務(wù)凌摄,因?yàn)檎w系統(tǒng)中會(huì)有很多業(yè)務(wù)需要生成ID羡蛾,這樣可以共用一張表維護(hù)

3、max_id表示現(xiàn)在整體系統(tǒng)中已經(jīng)分配的最大ID

4锨亏、desc描述

5痴怨、update_time表示每次取的ID時(shí)間

我們?cè)賮砜纯凑w流程:

1、【用戶服務(wù)】在注冊(cè)一個(gè)用戶時(shí)器予,需要一個(gè)用戶ID浪藻;會(huì)請(qǐng)求【生成ID服務(wù)(是獨(dú)立的應(yīng)用)】的接口

2、【生成ID服務(wù)】會(huì)去查詢數(shù)據(jù)庫乾翔,找到user_tag的id爱葵,現(xiàn)在的max_id為0,step=1000

3末融、【生成ID服務(wù)】把max_id和step返回給【用戶服務(wù)】钧惧;并且把max_id更新為max_id = max_id + step,即更新為1000

4勾习、【用戶服務(wù)】獲得max_id=0浓瞪,step=1000;

5巧婶、 這個(gè)用戶服務(wù)可以用ID=【max_id + 1乾颁,max_id+step】區(qū)間的ID,即為【1艺栈,1000】

6英岭、【用戶服務(wù)】會(huì)把這個(gè)區(qū)間保存到j(luò)vm中

7、【用戶服務(wù)】需要用到ID的時(shí)候湿右,在區(qū)間【1诅妹,1000】中依次獲取id,可采用AtomicLong中的getAndIncrement方法。

8吭狡、如果把區(qū)間的值用完了尖殃,再去請(qǐng)求【生產(chǎn)ID服務(wù)】接口,獲取到max_id為1000划煮,即可以用【max_id + 1送丰,max_id+step】區(qū)間的ID,即為【1001弛秋,2000】

這個(gè)方案就非常完美的解決了數(shù)據(jù)庫自增的問題器躏,而且可以自行定義max_id的起點(diǎn),和step步長蟹略,非常方便擴(kuò)容登失。

而且也解決了數(shù)據(jù)庫壓力的問題,因?yàn)樵谝欢螀^(qū)間內(nèi)科乎,是在jvm內(nèi)存中獲取的壁畸,而不需要每次請(qǐng)求數(shù)據(jù)庫。即使數(shù)據(jù)庫宕機(jī)了茅茂,系統(tǒng)也不受影響捏萍,ID還能維持一段時(shí)間。

3.2空闲、競(jìng)爭(zhēng)問題

以上方案中令杈,如果是多個(gè)用戶服務(wù),同時(shí)獲取ID碴倾,同時(shí)去請(qǐng)求【ID服務(wù)】逗噩,在獲取max_id的時(shí)候會(huì)存在并發(fā)問題。

如用戶服務(wù)A跌榔,取到的max_id=1000 ;用戶服務(wù)B取到的也是max_id=1000异雁,那就出現(xiàn)了問題,Id重復(fù)了僧须。那怎么解決纲刀?

其實(shí)方案很多,加分布式鎖担平,保證同一時(shí)刻只有一個(gè)用戶服務(wù)獲取max_id示绊。當(dāng)然也可以用數(shù)據(jù)庫自身的鎖去解決。

ZQWVWR(APRT078LF3PER_R4.png

利用事務(wù)方式加行鎖暂论,上面的語句面褐,在沒有執(zhí)行完之前,是不允許第二個(gè)用戶服務(wù)請(qǐng)求過來的取胎,第二個(gè)請(qǐng)求只能阻塞展哭。

3.3、突發(fā)阻塞問題

![ZG_(BZ`6%OYJZDB3}CN4KJ.png

上圖中,多個(gè)用戶服務(wù)獲取到了各自的ID區(qū)間摄杂,在高并發(fā)場(chǎng)景下坝咐,ID用的很快,如果3個(gè)用戶服務(wù)在某一時(shí)刻都用完了析恢,同時(shí)去請(qǐng)求【ID服務(wù)】。因?yàn)樯厦嫣岬降母?jìng)爭(zhēng)問題秧饮,所有只有一個(gè)用戶服務(wù)去操作數(shù)據(jù)庫映挂,其他二個(gè)會(huì)被阻塞。

小伙伴就會(huì)問盗尸,有這么巧嗎柑船?同時(shí)ID用完。我們這里舉的是3個(gè)用戶服務(wù)泼各,感覺概率不大鞍时;如果是100個(gè)用戶服務(wù)呢?概率是不是一下子大了扣蜻。

出現(xiàn)的現(xiàn)象就是一會(huì)兒突然系統(tǒng)耗時(shí)變長逆巍,一會(huì)兒好了,就是這個(gè)原因?qū)е碌拿梗趺慈ソ鉀Q锐极?

3.4、雙buffer方案

在一般的系統(tǒng)設(shè)計(jì)中芳肌,雙buffer會(huì)經(jīng)沉樵伲看到,怎么去解決上面的問題也可以采用雙buffer方案亿笤。

![0Z~R$Z0ZXW93FBYX@908}A.png

在設(shè)計(jì)的時(shí)候翎迁,采用雙buffer方案,上圖的流程:

1净薛、當(dāng)前獲取ID在buffer1中汪榔,每次獲取ID在buffer1中獲取

2、當(dāng)buffer1中的Id已經(jīng)使用到了100罕拂,也就是達(dá)到區(qū)間的10%

3揍异、達(dá)到了10%,先判斷buffer2中有沒有去獲取過爆班,如果沒有就立即發(fā)起請(qǐng)求獲取ID線程衷掷,此線程把獲取到的ID,設(shè)置到buffer2中柿菩。

4戚嗅、如果buffer1用完了,會(huì)自動(dòng)切換到buffer2

5、buffer2用到10%了懦胞,也會(huì)啟動(dòng)線程再次獲取替久,設(shè)置到buffer1中

6、依次往返

雙buffer的方案躏尉,小伙伴們有沒有感覺很酷蚯根,這樣就達(dá)到了業(yè)務(wù)場(chǎng)景用的ID,都是在jvm內(nèi)存中獲得的胀糜,從此不需要到數(shù)據(jù)庫中獲取了颅拦。允許數(shù)據(jù)庫宕機(jī)時(shí)間更長了。

因?yàn)闀?huì)有一個(gè)線程教藻,會(huì)觀察什么時(shí)候去自動(dòng)獲取距帅。兩個(gè)buffer之間自行切換使用。就解決了突發(fā)阻塞的問題括堤。

四碌秸、總結(jié)

此方案是某團(tuán)使用的分布式ID算法,小伙伴們?nèi)绻肓私飧钋那裕梢匀ゾW(wǎng)上搜下讥电,這里應(yīng)該介紹了比較詳細(xì)了。

當(dāng)然此方案美團(tuán)還做了一些別的優(yōu)化广匙,監(jiān)控ID使用頻率允趟,自動(dòng)設(shè)置步長step,從而達(dá)到對(duì)ID節(jié)省使用鸦致。

此ID方案非常適合《分庫分表潮剪?如何做到永不遷移數(shù)據(jù)和避免熱點(diǎn)?》中的ID需求分唾。

但此ID存在一定的問題抗碰,就是太過連續(xù),競(jìng)爭(zhēng)對(duì)手可以預(yù)測(cè)绽乔,不適合訂單ID弧蝇。我們?cè)谙乱黄恼轮欣^續(xù)介紹,敬請(qǐng)期待折砸!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末看疗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子睦授,更是在濱河造成了極大的恐慌两芳,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件去枷,死亡現(xiàn)場(chǎng)離奇詭異怖辆,居然都是意外死亡是复,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門竖螃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淑廊,“玉大人,你說我怎么就攤上這事特咆〖境停” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵腻格,是天一觀的道長蜀备。 經(jīng)常有香客問我,道長荒叶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任输虱,我火速辦了婚禮些楣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宪睹。我一直安慰自己愁茁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布亭病。 她就那樣靜靜地躺著鹅很,像睡著了一般。 火紅的嫁衣襯著肌膚如雪罪帖。 梳的紋絲不亂的頭發(fā)上促煮,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音整袁,去河邊找鬼菠齿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛坐昙,可吹牛的內(nèi)容都是我干的绳匀。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼炸客,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼疾棵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起痹仙,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤是尔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蝶溶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗜历,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宣渗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了梨州。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痕囱。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖暴匠,靈堂內(nèi)的尸體忽然破棺而出鞍恢,到底是詐尸還是另有隱情,我是刑警寧澤每窖,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布帮掉,位于F島的核電站,受9級(jí)特大地震影響窒典,放射性物質(zhì)發(fā)生泄漏蟆炊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一瀑志、第九天 我趴在偏房一處隱蔽的房頂上張望涩搓。 院中可真熱鬧,春花似錦劈猪、人聲如沸昧甘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽充边。三九已至,卻和暖如春常侦,著一層夾襖步出監(jiān)牢的瞬間浇冰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國打工刮吧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留湖饱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓杀捻,卻偏偏與公主長得像井厌,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子致讥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 在復(fù)雜分布式系統(tǒng)中仅仆,往往需要對(duì)大量的數(shù)據(jù)和消息進(jìn)行唯一標(biāo)識(shí)。比如京東等電商平臺(tái)的訂單ID垢袱,微信等IM應(yīng)用的消息ID...
    小星的java學(xué)習(xí)筆記閱讀 1,024評(píng)論 0 0
  • 收藏學(xué)習(xí)點(diǎn)擊查看原作出處[www.toutiao.com/i6682672464708764174] 一墓拜、引言 1...
    52Hetrz閱讀 453評(píng)論 0 0
  • 一、什么是分布式系統(tǒng)唯一 ID 在復(fù)雜分布式系統(tǒng)中请契,往往需要對(duì)大量的數(shù)據(jù)和消息進(jìn)行唯一標(biāo)識(shí)咳榜。 如在金融夏醉、電商、支付...
    大魚燉海棠閱讀 2,717評(píng)論 1 63
  • 每個(gè)公司的業(yè)務(wù)場(chǎng)景不同涌韩,生成唯一ID畔柔、序列號(hào)或者單號(hào)的方案也都不一樣,這邊簡(jiǎn)單列舉一些常見的方案: 一臣樱、 數(shù)據(jù)庫自...
    晚歌歌閱讀 4,680評(píng)論 0 2
  • 因?yàn)橹煜壬囊痪洹斑@底下有活水” 因?yàn)橄眿D躺過的地方生出了小苗 白嘉軒用天字號(hào)的地 去換鹿子霖的路 果真挖出了活水...
    Zack要多喝熱水閱讀 81評(píng)論 0 0