高并发分布式系统中生成全局唯一(订单号)Id

news/2024/5/19 0:22:50

1、GUID数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么通过组合的方式,保留GUID的10个字节,用另6个字节表示GUID生成的时间(DateTime),这样我们将时间信息与GUID组合起来,在保留GUID的唯一性的同时增加了有序性,以此来提高索引效率,在NHibernate中,COMB型主键的生成代码如下所示:

        /// <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位。

 

2、将GUID转为了19位数字

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

上述方法循环测试生成id如下图

结论:适合大型应用,从业务上来说,有一个规则的编码能体现产品的专业成度。

 

转载于:https://www.cnblogs.com/linJie1930906722/p/9547749.html


http://www.niftyadmin.cn/n/4388917.html

相关文章

全国计算机三级网络工程技术20天指南

这篇文章&#xff0c;可能会有人在之前看到过&#xff0c;不过不影响。因为我也是在前者的基础上&#xff0c;添加了部分新内容的总结&#xff0c;或许不多。但应对三级考试足够了。不用担心你没基础&#xff0c;这篇指南就是给特别懒的你准备的0基础指南。郑重声明&#xff1a…

Android项目集成穿山甲开屏/插屏/横幅广告教程大全

Android项目集成穿山甲开屏/插屏/横幅广告教程大全 开发及项目环境说明 Android Studio 2020.3.1 Patch 4/203.7717.56.2031.7935034 jdk11.0.9 Android Gradle Plugin Version 7.0.4 Gradle Version 7.0.2 compileSdk 31 minSdk 21 targetSdk 31 穿山甲com.pangle.cn:ads-…

php上传文件找不到临时文件夹

错误原因&#xff1a; 一、配置文件没有设置临时文件夹 二、临时文件夹没有或者上级文件夹没有相应的权限 处理方式&#xff1a; 找到PHP配置文件php.ini&#xff0c;找到以下代码 ;upload_tmp_dir 改为&#xff1a; upload_tmp_dir "C:\Windows\Temp" //后面的文…

[Andrioid开发] Splash界面/用户协议与隐私政策弹窗/界面开发

[Andrioid开发] Splash界面/用户协议与隐私政策弹窗/界面开发 启动页界面开发、首次启动时的启动页用户协议与隐私政策弹窗&#xff0c;只要不点击同意每次打开都会显示弹窗&#xff0c;同意后立即跳转到主界面&#xff0c;当下次再进入软件就是两秒后自动跳转到主界面。 Splas…

c语言中自定义bool函数模板

首先&#xff0c;c语言中没有bool函数类型&#xff0c;只有c中有&#xff0c;所以需要自定义&#xff0c;即c中表示bool类型的方法&#xff1a; 1.模板1 typedef int bool; #define false 0 #define true 12.模板2 typedef int bool; enum { false, true };3.模板3 typede…

[安卓逆向]apktool实现APK反编译、重打包、签名

apktool实现APK反编译、重打包、签名 写在前面 apktool 主要用于逆向apk文件。它可以将资源解码&#xff0c;并在修改后可以重新构建它们。 下载apktool APKtool官网&#xff1a;https://ibotpeaches.github.io/Apktool/ APKtool下载&#xff1a;https://bitbucket.org/iB…

《算法笔记》codeup题集——第二章

对于《算法笔记》一书&#xff0c;笔者目前只是写了一个多月&#xff0c;预计会用三个月写完全部题解&#xff0c;从第六章开始会用C题解&#xff0c;而之前的都是纯C题解&#xff0c;主要是笔者认为用C更好。当然你如果有更好的题解&#xff0c;欢迎留言交流&#xff01;&…

[安卓逆向]一步到位动态调试AliCrackme的so文件

[安卓逆向]一步到位动态调试AliCrackme的so文件 写在前面 续文章 [超级详细]实战分析一个Crackme的过程&#xff1a;https://blog.csdn.net/yi_rui_jie/article/details/122664078 之前分析这个AliCrackme后总结过程有些繁琐&#xff0c;需要几次替换APK内文件及签名和不断重…