雪花算法:
特性:
1,在多节点下,可以保证我们的全局id的唯一性,不会出现id重复的现象;
2,可以保证我们的id在单节点下是可以排序的;
3,id的位数固定,不会因为id的增长导致我们id的位数变更;
4,id的类型是long类型的数字,不会像uuid虽然保证了唯一性,但是为string类型,查询效率在mysql中要低于long类型;
算法解析:
雪花算法是一个64字节的long类型数字,其中各部分含义如下。
1,第一部分1个 bit:0,这个是无意义的,它保证了我们的二进制中的首位为0,如果为1则为负数。
2,第二部分41个 bit:表示的是单位为毫秒的时间戳,来保证我们的id是有序的。
4,第三部分是10个 bit:前5个bit表示的是机房id,最多可以有32个机房;后5个bit表示的是机器id,最多可以有32台机器;
6,最后部分是12个 bit:表示的序号,就是某个机房某台机器上这一毫秒内同时生成的 id 的序号,可以保证一毫秒内有4096个id;
使用步骤:
1,创建一个项目,将id包解压放入到项目中,调整package路径。
2,测试直接打开testcreateid.java类运行main方法。
3,项目中使用直接调用getid.createid();方法即可。
4,分布式环境下,根据不同的机房要配置不同的机房号和机器号,最多可以配置32*32个节点;在配置文件中配置相关的机房号和机器号;
在项目启动的时候,通过shell脚本设置机房好和机器号数值;
-Dsnowflake.workerId=1 -Dsnowflake.datacenterId=1 --启动时传入参数‘机房号’和‘机器号’