高可用序列号生成器实现:时间戳同步与IP地址特征
5星 · 超过95%的资源 需积分: 48 79 浏览量
更新于2024-09-07
1
收藏 2KB TXT 举报
这段代码是Java实现的一个序列号生成器,主要用于生成具有时间戳、数据中心ID、工作节点ID和序列号的独特标识。序列号的生成过程考虑到了时间同步问题,确保在多节点系统中生成的ID连续且有序。
1. **序列号生成逻辑**:
- `public synchronized String nextId()` 方法是整个序列号生成的核心部分。首先,它通过`timeGen()`方法获取当前的时间戳(毫秒级别)。
- 如果当前时间戳小于上一次生成的时间戳,表明系统时间可能回退,抛出异常,以避免生成不连续的ID。
- 当前时间戳与上一次相同,表示仍在同一毫秒内。这时,序列号自增(12位),与`sequenceMask`(一个掩码,用于清除序列号高位)进行按位与操作,保证序列号范围在0-4095之间。如果序列号达到4096,则会进入下一次毫秒,等待直到`tilNextMillis()`返回新的时间戳。
- 如果时间戳不同,意味着进入新的一毫秒,序列号被重置为0,从下个毫秒的序列号开始递增。
- 接下来,将数据中心ID、工作节点ID和序列号拼接成一个long类型的suffix,并与日期时间前缀格式化后字符串连接,形成最终的序列号。
2. **时间同步处理**:
- `tilNextMillis(long lastTimestamp)` 方法用于在当前时间戳小于上一次生成的时间戳时,循环调用`timeGen()`,直到找到一个新的足够大的时间戳,确保序列号的连续性。
- `protected long timeGen()` 返回的是当前系统的毫秒时间戳,这是序列生成的基础。
3. **辅助方法**:
- `private byte getLastIP()` 用于获取本地主机的最后一个IP地址字节,这可能是为了在生成的序列号中包含机器的唯一标识。这个方法用于增加序列号的多样性,但在这个上下文中并未直接用于序列号生成。
总结来说,这个序列号生成器采用了一种高效的方法来处理时间同步问题,确保在分布式环境中生成的ID既有序又具有唯一性。同时,通过结合时间戳、数据中心ID、工作节点ID和本地IP等信息,生成的序列号能够反映出生成时的特定上下文。
2020-09-04 上传
2021-01-30 上传
2019-03-22 上传
2020-08-22 上传
tonyzane88
- 粉丝: 0
- 资源: 2
最新资源
- SOA的权威指南BEA AquaLogic 服务总线(The Definitive Guide to SOA_ BEA AquaLogic Service Bus)
- 接口测试.doc 软件系统的主要测试内容及技术
- ArcGIS+Desktop轻松入门
- JAVA线程与IO总结
- .Apress.PHP.5.Recipes.A.Problem.Solution.Approach.Sep.2005
- 不错的lingo教程
- getting_started_with_Flex3.pdf
- oracle数据库开发的一些经验积累
- altera Nios II 处理器参考手册
- JavaFX Script 语言教程
- JMS简明教程.pdf
- 代码大全2 英文版 pdf
- spring框架技术详解
- 信息系统监理师考试复习资料(真题加答案)
- ARP欺骗程序源代码
- HP.and.MySQL.5.From.Novice.to.Professional.2nd.Edition.Jan.2006