博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高并发分布式系统中生成全局唯一(订单号)Id
阅读量:6989 次
发布时间:2019-06-27

本文共 1920 字,大约阅读时间需要 6 分钟。

hot3.png

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

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

 

///         /// 保留GUID的10个字节,用另6个字节表示GUID生成的时间(DateTime)组合方式        ///         /// 
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位数字

 

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

 

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

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

转载于:https://my.oschina.net/demons99/blog/2120461

你可能感兴趣的文章
ios第一天
查看>>
使用Kubeadm部署Kubernetes
查看>>
实现按钮点击事件
查看>>
第一次作业
查看>>
009 牌视图实现
查看>>
Kubernetes安装
查看>>
4、AngularJS2 数据显示
查看>>
CefSharp获取网页源码时卡住长时间没有返回结果
查看>>
刚入门Python的小伙伴,这是腾讯大牛工作中总结的爬虫经验!
查看>>
智能微型机器人可随周围环境“变身”
查看>>
Linux操作系统 MBR扇区故障了怎么办
查看>>
蛋花花介绍web开发语言选择PHP好还是java好
查看>>
Java中使用FastJSON进行对象的序列化和反序列化
查看>>
linux 无法引导系统 grub rescue>
查看>>
Java网络编程基础(一)
查看>>
在Mac版本下的IDEA中设置代码注释模版
查看>>
我的友情链接
查看>>
Ruby实现二分法查找
查看>>
OA系统报错
查看>>
JavaScript设计模式之一:面向对象的Javascript
查看>>