前言:
当前小伙伴们对“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