龙空技术网

分布式ID生成器-百度UidGenerator

蚂蚁背大象的日常 576

前言:

当前小伙伴们对“javauid”大概比较关怀,大家都想要知道一些“javauid”的相关资讯。那么小编同时在网摘上网罗了一些对于“javauid””的相关内容,希望兄弟们能喜欢,同学们快快来了解一下吧!

1.UidGenerator

UidGenerator由百度基于Snowflake算法的唯一ID生成器的Java实现。但是和Snowflake算法又有所区别:

Snowflake算法的 time(41bit)、machine id(10bit)、sequence number (12bit) 这个三个段所占的位数是固定的,而UidGenerator的设计让这三个变成了可配置。可以灵活地调整。下面是位数对比图

Snowflake算法是固定的。

时间标识在Snowflake算法中是相对时间毫秒,UidGenerator中使用的是秒UidGenerator的 machine id(worker id) 默认是由数据库分配的。每启动一次往表WORKER_NODE中插入一条数据,然后获取ID作为 machine id(worker id) 。 mysql数据库不是必须依赖的。同时支持自定义worker id的位数以及初始化策略。很好地支持了容器化技术

Tips: 每次启动都会往WORKER_NODE表中插入数据

在百度UidGenerator的实现细节原理可以查看文档:。

Tips: 在这个实现里面降到了一个FalseSharing问题(为共享),这个有兴趣的可以去网上查询相关的资料。后续有时间补上这一块的知识,我也是第一次遇到这个知识点。

2. UidGenerator Java实现2.1 服务运行

clone代码:

git clone 

执行脚本:

从代码中scripts/WORKER_NODE.sql 获取脚本

CREATE TABLE WORKER_NODE(ID BIGINT NOT NULL AUTO_INCREMENT COMMENT 'auto increment id',HOST_NAME VARCHAR(64) NOT NULL COMMENT 'host name',PORT VARCHAR(64) NOT NULL COMMENT 'port',TYPE INT NOT NULL COMMENT 'node type: ACTUAL or CONTAINER',LAUNCH_DATE DATE NOT NULL COMMENT 'launch date',MODIFIED TIMESTAMP NOT NULL COMMENT 'modified time',CREATED TIMESTAMP NOT NULL COMMENT 'created time',PRIMARY KEY(ID)) COMMENT='DB WorkerID Assigner for UID Generator',ENGINE = INNODB,CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

上述脚本增加 CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

配置mysql.properties文件:

mysql.properties在test的目录下面,只需要配置和数据库相关的即可

jdbc.url=jdbc:mysql://192.168.43.129:3306/leaf?useUnicode=true&characterEncoding=utf-8jdbc.username=rootjdbc.password=sys123456

运行UnitTest:

执行CachedUidGeneratorTest测试类:

数据库里面的数据:

Tips: 每次启动都往数据库插入数据,这里个人觉得可以优化。

3.总结

百度UidGenerator是雪花算法另外一种实现,相比雪花算法固定了每个段的长度。这里设计成可调整的给使用者提供更加灵活。同时接入数据库的自增来实现Worker Id的设置(这里也可以自行拓展)。但是这个也有一个不足就是你不停的重启服务数据库表WORKER_NODE中的数据会越来越多。UidGenerator做成一个jar包集成到本地服务。

我是蚂蚁背大象,文章对你有帮助点赞关注我,文章有不正确的地方请您斧正留言评论~谢谢

参考资料:

标签: #javauid