package com.taobao.metamorphosis.server.utils;
import com.taobao.metamorphosis.server.exception.InvalidSystemClock;
/**
* 来自于twitter项目<a
* href="https://github.com/twitter/snowflake">snowflake</a>的id产生方案,全局唯一,时间有序
*
*
* @see https://github.com/twitter/snowflake
* @author boyan
* @Date 2011-4-27
*
*/
public class IdWorker {
private final long workerId;
private final long twepoch = 1303895660503L;
private long sequence = 0L;
private final long workerIdBits = 10L;
private final long maxWorkerId = -1L ^ -1L << this.workerIdBits;
private final long sequenceBits = 12L;
private final long workerIdShift = this.sequenceBits;
private final long timestampLeftShift = this.sequenceBits + this.workerIdBits;
private final long sequenceMask = -1L ^ -1L << this.sequenceBits;
private long lastTimestamp = -1L;
public IdWorker(long workerId) {
super();
if (workerId > this.maxWorkerId || workerId < 0) {
throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0",
this.maxWorkerId));
}
this.workerId = workerId;
}
public synchronized long nextId() {
long timestamp = this.timeGen();
if (this.lastTimestamp == timestamp) {
this.sequence = this.sequence + 1 & this.sequenceMask;
if (this.sequence == 0) {
timestamp = this.tilNextMillis(this.lastTimestamp);
}
}
else {
this.sequence = 0;
}
if (timestamp < this.lastTimestamp) {
throw new InvalidSystemClock(String
.format("Clock moved backwards. Refusing to generate id for %d milliseconds",
(this.lastTimestamp - timestamp)));
}
this.lastTimestamp = timestamp;
return timestamp - this.twepoch << this.timestampLeftShift | this.workerId << this.workerIdShift
| this.sequence;
}
private long tilNextMillis(long lastTimestamp) {
long timestamp = this.timeGen();
while (timestamp <= lastTimestamp) {
timestamp = this.timeGen();
}
return timestamp;
}
private long timeGen() {
return System.currentTimeMillis();
}
}
分享到:
相关推荐
生成32位永不重复的随机数作为id,java开发中经常用到,包里是apache的2个jar
索引此时就引入了雪花ID,它既能保证ID的有序性,又保证了ID的唯一性,兼顾自增ID和UUID的共同优点。 雪花ID的优点: 高性能高可用:生成时不依赖于数据库,完全在内存中生成。 容量大:每秒能生成数百万的自增ID。...
twitter在把存储系统从MySQL迁移到Cassandra的过程中由于Cassandra没有顺序ID生成机制,于是自己开发了一套全局唯一ID生成服务:Snowflake。 1 41位的时间序列(精确到毫秒,41位的长度可以使用69年) 2 10位的机器...
twitter雪花算法的java实现,分布式系统中,有一些...而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移到Cassandra,因为Cassandra没有顺序ID生成机制,所以开发了这样一套全局唯一ID生成服务。
分布式系统,全局唯一ID,高效,永不重复。相比较uuid,雪花id是按照时间有序生成的,方便sql优化
使用Java的Util.UUID生成32位的有序与无序id
Twitter的 Snowflake JAVA实现方案,id生成器。高效生成15位的有序的数字类型id,亲测可用
Twitter的雪花算法SnowFlake,使用Java代码实现。 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位...有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。
Identification:id生成工具类,包括 UUID luhn算法id(适用于有序的流水号码) ImgUtil:图片相似度计算工具 ItvJsonUtil:基于fastjson的json工具类 JsonUtility:基于jackjson的接送工具类 MailUtil:邮件...
雪花算法分布式ID生成器 该项目的目的是提供一个轻量级、高并发、高可用的生成唯一ID的服务,生成的ID是一个64位的 长整型,全局唯一,保持递增,相对有序。...一个ID生成器,所以得到的ID都是递增、有序的。 H
可以利用时间的有序性, 并且在某个时间单元下采用自增序列 粗略有序 在分布式系统中, 难以做到绝对有序, 因此可以采用相对有序的方式 可反解 一个 ID 在生成后, 本身就带有很多信息量, 在存储层面可以省下传统的 ...
而twitter的snowflake解决了这种需求,最初是Twitter把存储系统从MySQL迁移到Cassandra,因为Cassandra没有顺序的ID生成机制,所以开发了这样一套唯一的ID生成服务。结构雪花的结构如下(每部分用-分开): 0 - ...
ID生成方式 一致性hash 限流 微服务 微服务介绍 服务发现 API网关 服务容错保护 服务配置中心 算法 数组-快速排序-第k大个数 数组-对撞指针-最大蓄水 数组-滑动窗口-最小连续子数组 数组-归并排序-合并有序数组 链表...
| rim-id-generator | ID生成层:生成群聊、单聊的消息id | ## 亮点 + 设计模式 + 使用策略模式实现Client的各种内置命令、Netty接收消息处理、Router转发逻辑等功能 + 使用读扩散实现群聊离线消息拉取 + 使用...
HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...
leetcode手册JAVA LeetCode 实践 解决方案清单 不。 ID。 名称 解决方案 最后更新 1 二和 2020-09-09 21:42 2 两个数字相加 2020-09-06 18:42 3 无重复字符的最长子串 2020-09-06 18:42 4 两个有序数组的中位数 2020...
主要给大家介绍了关于spring boot整合mybatis利用Mysql实现主键UUID的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
ID problem 难度 使用语言 思路 提交次数 WA点 star 1 两数之和 简单 C++ 2 两数相加 中等 Java 3 无重复字符的最长子串 中等 Java 5 最长回文子串 中等 python 7 整数反转 简单 python 8 字符串转换整数(atoi) 中等...
ID 问题 Java Python 暗示 困难 1 二和 √ √ 哈希图 简单的 2 两个数字相加 √ √ 中等的 3 无重复字符的最长子串 √ √ 中等的 4 两个有序数组的中位数 √ √ 难的 5 最长回文子串 √ √ 中等的 8 字符串到整数 ...
6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 三重关联(Ternary associations) 6.3.4. 使用 6.4. 集合例子(Collection example) 7. 关联关系映射 7.1. 介绍 ...