高併發分佈式系統中生成全局惟一(訂單號)Id

一、GUID數據因毫無規律可言形成索引效率低下,影響了系統的性能,那麼經過組合的方式,保留GUID的10個字節,用另6個字節表示GUID生成的時間(DateTime),這樣咱們將時間信息與GUID組合起來,在保留GUID的惟一性的同時增長了有序性,以此來提升索引效率,在NHibernate中,COMB型主鍵的生成代碼以下所示:ide

        /// <summary>
        /// 保留GUID的10個字節,用另6個字節表示GUID生成的時間(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);
        }

上述方法循環測試生成id以下圖性能

 結論:適合大型應用。即保留GUID的惟一性的同時增長了GUID有序性,提升了索引效率;解決了關聯表業務問題;生成的Id不夠友好;佔據了32位。測試

 

二、將GUID轉爲了19位數字ui

        /// <summary>
        /// 根據GUID獲取19位的惟一數字序列
        /// </summary>
        public static long GuidToLong()
        {
            byte[] buffer = Guid.NewGuid().ToByteArray();
            return BitConverter.ToInt64(buffer, 0);
        }

上述方法循環測試生成id以下圖編碼

結論:適合大型應用,從業務上來講,有一個規則的編碼能體現產品的專業成度。spa

相關文章
相關標籤/搜索