Explorar o código

修改 idworker

hubin %!s(int64=9) %!d(string=hai) anos
pai
achega
dd26ad11d0

+ 13 - 7
mybatis-plus/src/main/java/com/baomidou/mybatisplus/toolkit/Sequence.java

@@ -24,10 +24,12 @@ import com.baomidou.mybatisplus.exceptions.MybatisPlusException;
 /**
  * <p>
  * 分布式高效有序ID生产黑科技(sequence)
+ * <br>
+ * 优化开源项目:http://git.oschina.net/yu120/sequence
  * </p>
  * 
  * @author hubin
- * @date 2016-08-01
+ * @date 2016-08-18
  */
 public class Sequence {
 	/* 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) */
@@ -51,8 +53,14 @@ public class Sequence {
 	private long lastTimestamp = -1L;/* 上次生产id时间戳 */
 	
 	public Sequence() {
-		this.datacenterId = getDatacenterId();
-		/* MAC + PID 的 hashcode 获取16个低位 */
+		/*
+		 * 数据标识id部分
+		 */
+		this.datacenterId = getDatacenterId() % (maxDatacenterId + 1);
+
+		/*
+		 * MAC + PID 的 hashcode 获取16个低位
+		 */
 		long macPidHashCode = (datacenterId + "" + getJvmPid()).hashCode() & 0xffff;
 		this.workerId = macPidHashCode % (maxWorkerId + 1);
 	}
@@ -65,12 +73,10 @@ public class Sequence {
 	 */
 	public Sequence(long workerId, long datacenterId) {
 		if (workerId > maxWorkerId || workerId < 0) {
-			throw new IllegalArgumentException(
-					String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
+			throw new MybatisPlusException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
 		}
 		if (datacenterId > maxDatacenterId || datacenterId < 0) {
-			throw new IllegalArgumentException(
-					String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
+			throw new MybatisPlusException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
 		}
 		this.workerId = workerId;
 		this.datacenterId = datacenterId;

BIN=BIN
mybatis-plus/src/test/resources/wiki/img/perf.png


BIN=BIN
mybatis-plus/src/test/resources/wiki/img/snowflake-64bit.jpg


+ 27 - 0
mybatis-plus/src/test/resources/wiki/sequence.md

@@ -0,0 +1,27 @@
+#分布式高效ID (sequence)
+
+##简介
+分布式高效 ID 算法(sequence), 基于 Snowflake 实现64位自增 ID 算法。
+
+Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统中不同机器产生的id必须不同。
+
+性能测试数据:
+
+![性能测试结果](src/test/resources/wiki/img/perf.png)
+
+##Snowflake算法核心
+把时间戳,工作机器id,序列号组合在一起。
+
+![Snowflake算法核心](src/test/resources/wiki/img/snowflake-64bit.jpg)
+
+除了最高位bit标记为不可用以外,其余三组bit占位均可浮动,看具体的业务需求而定。默认情况下41bit的时间戳可以支持该算法使用到2082年,10bit的工作机器id可以支持1023台机器,序列号支持1毫秒产生4095个自增序列id。下文会具体分析。
+
+##Snowflake – 时间戳
+这里时间戳的细度是毫秒级,具体代码如下,建议使用64位linux系统机器,因为有vdso,gettimeofday()在用户态就可以完成操作,减少了进入内核态的损耗。
+
+##Snowflake – 工作机器id
+严格意义上来说这个bit段的使用可以是进程级,机器级的话你可以使用MAC地址来唯一标示工作机器,工作进程级可以使用IP+Path来区分工作进程。如果工作机器比较少,可以使用配置文件来设置这个id是一个不错的选择,如果机器过多配置文件的维护是一个灾难性的事情。
+
+##Snowflake – 序列号
+序列号就是一系列的自增id(多线程建议使用atomic),为了处理在同一毫秒内需要给多条消息分配id,若同一毫秒把序列号用完了,则“等待至下一毫秒”。
+