网站首页 > 开源技术 正文
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的实现细节原理可以查看文档:https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md。
Tips: 在这个实现里面降到了一个FalseSharing问题(为共享),这个有兴趣的可以去网上查询相关的资料。后续有时间补上这一块的知识,我也是第一次遇到这个知识点。
2. UidGenerator Java实现
2.1 服务运行
clone代码:
git clone https://github.com/baidu/uid-generator.git
执行脚本:
从代码中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-8
jdbc.username=root
jdbc.password=sys123456
运行UnitTest:
执行CachedUidGeneratorTest测试类:
数据库里面的数据:
Tips: 每次启动都往数据库插入数据,这里个人觉得可以优化。
3.总结
百度UidGenerator是雪花算法另外一种实现,相比雪花算法固定了每个段的长度。这里设计成可调整的给使用者提供更加灵活。同时接入数据库的自增来实现Worker Id的设置(这里也可以自行拓展)。但是这个也有一个不足就是你不停的重启服务数据库表WORKER_NODE中的数据会越来越多。UidGenerator做成一个jar包集成到本地服务。
我是蚂蚁背大象,文章对你有帮助点赞关注我,文章有不正确的地方请您斧正留言评论~谢谢
参考资料:
- https://github.com/baidu/uid-generator
- https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md
- 上一篇: java的加密解密工具类
- 下一篇: 你的接口真的安全吗?
猜你喜欢
- 2024-11-26 MySQL分库分表实战
- 2024-11-26 MobaXterm 之 Network Services
- 2024-11-26 SpringBoot系列(十五)整合缓存,项目必用的技术
- 2024-11-26 盘点认证框架 : SpringSecurity OAuth 篇
- 2024-11-26 @Cacheable缓存key生成策略及自定义key
- 2024-11-26 对称加密算法之Java SM4算法应用 附可用工具类
- 2024-11-26 java中加密算法AES和RSA
- 2024-11-26 领域驱动设计系列课程-领域服务(4)
- 2024-11-26 设计模式——简单工厂模式( Simple Factory Pattern )
- 2024-11-26 Spring Boot使用Redis + Cafeine实现二级缓存?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)