一种在分布式系统内生成唯一ID的方法与流程

文档序号:12465337阅读:235来源:国知局
本发明涉及一种ID生成的方法,特别是一种在分布式系统内生成唯一ID的方法。
背景技术
:在分布式系统中,如何快速高效的生成系统唯一ID,是在设计一个系统的时候经常遇到的问题。现有技术中生成ID的方法主要有以下三种,以适应不同的场景、需求以及性能要求,但都存在各自的缺陷。1.数据库自增长序列利用数据库的自增长序列实现,实现简单,ID有序,对分页和排序很有帮助。但是不同的数据库,序列语法和实现各不相同,数据库迁移、多表合并、以及数据库分表分库时非常麻烦。并且在单个数据库或者读写分离或一主多从的情况下,只有一个库生成序列,有单点故障的风险。2.UUIDUUID代码简单,生成ID性能很好,基本不会有性能问题,且UUID全球唯一,在数据迁移,数据合并和数据库变更等情况下,都可以从容应对。但是UUID字符无序,无法保证趋势递增,对数据分页性能产生影响。3.Redis生成ID利用Redis的单线程来保证数据安全,通过原子操作INCR和INCRBY来实现。同时可通过Redis的集群实现更高的吞吐量和单点故障的问题。使用Redis来生成ID不依赖数据,方便灵活,且性能优于数据库。且生成的ID是有序的,对分页和排序有帮助,但是必须依赖于第三方工具Redis,增加了系统集成的复杂度。技术实现要素:本发明的目的在于提供一种在分布式系统内生成唯一ID的方法,运用该方法生成ID不仅效率高,不会对大数据量的查询和分页造成性能影响而且与系统集成便捷。实现本发明目的的技术方案是:一种在分布式系统内生成唯一ID的方法,其特征在于:包括以下步骤:1.1.获取服务器设定的默认基础时间,将该默认基础时间换算成二进制并做位移填充运算,将其左移24位;1.2.获取业务类型数值,将该业务类型数值换算成二进制并做位移填充运算,将换算得来的二进制数值左移20位;1.3.获取服务类型数值,将该服务类型数值换算成二进制并做位移填充运算,将换算得来的二进制数值左移16位;1.4.获取服务器号数值,将该服务器号数值换算成二进制并做位移填充运算,将换算得来的二进制数值左移12位;1.5.获取毫秒内自增数值,将该毫秒内自增数值换算成二进制;1.6.将步骤1.1~1.5运算得到的5项二进制进行或运算,得到二进制格式的ID值,将该二进制格式的ID值换算成十进制得到唯一ID值。本发明的优点在于:1.生成ID效率高,能够满足高并发系统的业务需求。2.生成的ID为数字且有序增加,不会对大数据量的查询和分页造成性能影响。3.本方法可以跟系统快速无缝集成,不需要第三方工具库和第三方软件的支持,减少系统集成难度。附图说明图1是本方法的逻辑步骤流程图。具体实施方式一种ID生成的方法,特别是一种在分布式系统内生成唯一ID的方法,其特征在于:包括以下步骤:1.1.获取服务器设定的默认基础时间,将该默认基础时间换算成二进制并做位移填充运算,将其左移24位;1.2.获取业务类型数值,将该业务类型数值换算成二进制并做位移填充运算,将换算得来的二进制数值左移20位;1.3.获取服务类型数值,将该服务类型数值换算成二进制并做位移填充运算,将换算得来的二进制数值左移16位;1.4.获取服务器号数值,将该服务器号数值换算成二进制并做位移填充运算,将换算得来的二进制数值左移12位;1.5.获取毫秒内自增数值,将该毫秒内自增数值换算成二进制;1.6.将步骤1.1~1.5运算得到的5项二进制进行或运算,得到二进制格式的ID值,将该二进制格式的ID值换算成十进制得到唯一ID值。实施例、1)得到当前时间的毫秒数:762824999253053440;2)假定系统中设定的基础时间毫秒数为1288834974657,因此减去基础时间毫秒数:762824999253053440-1288834974657=762823710418078783;3)假设系统业务类型、服务类型、所属服务器分别为2、9、1,获取当前的业务类型、服务类型、服务器号数值;4)获取毫秒内自增号5;5)计算id:Stepa:将毫秒数762824999253053440减去1288834974657,得到762823710418078783,左移24位得到的数值为2269171050489053184;毫秒数十进制762823710418078783二进制(64位)0000101010010110000110000001111101111101101101110000110000111111操作左移24位二进制值(64位)0001111101111101101101110000110000111111000000000000000000000000换算成十进制2269171050489053184Stepb:将业务类型数值2左移20位得到的数值为2097152;毫秒数十进制2二进制(64位)0000000000000000000000000000000000000000000000000000000000000010操作左移20位二进制值(64位)0000000000000000000000000000000000000000001000000000000000000000换算成十进制2097152Stepc:将服务类型数值9左移16位得到的数值为589824;毫秒数十进制9二进制(64位)0000000000000000000000000000000000000000000000000000000000001001操作左移16位二进制值(64位)0000000000000000000000000000000000000000000010010000000000000000换算成十进制589824Stepd:将服务器号数值1左移12位得到的数值为4096;毫秒数十进制1二进制(64位)0000000000000000000000000000000000000000000000000000000000000001操作左移12位二进制值(64位)0000000000000000000000000000000000000000000000000001000000000000换算成十进制4096Stepe:毫秒内自增数值5不做操作;毫秒数十进制5二进制(64位)0000000000000000000000000000000000000000000000000000000000000101操作无二进制值(64位)0000000000000000000000000000000000000000000000000000000000000101换算成十进制5stepf:将上述5步得到的数值进行或预算得到ID值经过上述步骤后可得到当前的ID值为2269171050491744261。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1