高并发分布式系统中生成全局唯一(订单号)Id
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
高并發(fā)分布式系統(tǒng)中生成全局唯一(訂單號(hào))Id
1、GUID數(shù)據(jù)因毫無規(guī)律可言造成索引效率低下,影響了系統(tǒng)的性能,那么通過組合的方式,保留GUID的10個(gè)字節(jié),用另6個(gè)字節(jié)表示GUID生成的時(shí)間(DateTime),這樣我們將時(shí)間信息與GUID組合起來,在保留GUID的唯一性的同時(shí)增加了有序性,以此來提高索引效率,在NHibernate中,COMB型主鍵的生成代碼如下所示:
?
/// <summary>/// 保留GUID的10個(gè)字節(jié),用另6個(gè)字節(jié)表示GUID生成的時(shí)間(DateTime)組合方式/// </summary>/// <returns></returns>public static Guid GenerateComb(){byte[] guidArray = Guid.NewGuid().ToByteArray();DateTime baseDate = new DateTime(1900, 1, 1);DateTime now = DateTime.Now;// Get the days and milliseconds which will be used to build //the byte string TimeSpan days = new TimeSpan(now.Ticks - baseDate.Ticks);TimeSpan msecs = now.TimeOfDay;// Convert to a byte array // Note that SQL Server is accurate to 1/300th of a // millisecond so we divide by 3.333333 byte[] daysArray = BitConverter.GetBytes(days.Days);byte[] msecsArray = BitConverter.GetBytes((long)(msecs.TotalMilliseconds / 3.333333));// Reverse the bytes to match SQL Servers ordering Array.Reverse(daysArray);Array.Reverse(msecsArray);// Copy the bytes into the guid Array.Copy(daysArray, daysArray.Length - 2, guidArray,guidArray.Length - 6, 2);Array.Copy(msecsArray, msecsArray.Length - 4, guidArray,guidArray.Length - 4, 4);return new Guid(guidArray);}?
上述方法循環(huán)測(cè)試生成id如下圖
?結(jié)論:適合大型應(yīng)用。即保留GUID的唯一性的同時(shí)增加了GUID有序性,提高了索引效率;解決了關(guān)聯(lián)表業(yè)務(wù)問題;生成的Id不夠友好;占據(jù)了32位。
?
2、將GUID轉(zhuǎn)為了19位數(shù)字
?
/// <summary>/// 根據(jù)GUID獲取19位的唯一數(shù)字序列/// </summary>public static long GuidToLong(){byte[] buffer = Guid.NewGuid().ToByteArray();return BitConverter.ToInt64(buffer, 0);}?
上述方法循環(huán)測(cè)試生成id如下圖
結(jié)論:適合大型應(yīng)用,從業(yè)務(wù)上來說,有一個(gè)規(guī)則的編碼能體現(xiàn)產(chǎn)品的專業(yè)成度。
轉(zhuǎn)載于:https://my.oschina.net/demons99/blog/2120461
總結(jié)
以上是生活随笔為你收集整理的高并发分布式系统中生成全局唯一(订单号)Id的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ 1003 物流运输 最短路+d
- 下一篇: 阿里云MVP闪亮云栖大会,技术干货持续更