1200页Java架构面试专题及答案
小编整理不易,对这份1200页Java架构面试专题及答案感兴趣劳烦帮忙转发/点赞
百度、字节、美团等大厂常见面试题
首先,需要定义ID组合方式所需的常量,如每段占用位数等
/* 开始时间 (2020-05-03) */
private final long twepoch = 1607529600000L;
/* 机器码所占的bit位数 = 10位 */
private final long workerIdBits = 10L;
/* 最大支持的机器码 = 1023,该式子相当与~(-1L << 10L) */
private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
/* 序列号所占的bit位数 */
private final long sequenceBits = 12L;
/* 机器码需要在序列号的左边 */
private final long workerIdShift = sequenceBits;
/* 时间戳的起始位置在序列号和机器码的左边 */
private final long timestampLeftShift = sequenceBits + workerIdBits;
/* 序列号的最大支持数值 */
private final long sequenceMask = -1L ^ (-1L << sequenceBits);
然后,定义三个位段的含义字段
/* 机器码 (0 ~ 1023) */
private long workerId;
/* 序列号 (0 ~ 4095) */
private long sequence = 0L;
/* 最后时间戳 */
private long lastTimestamp = -1L;
接下来,就是生产分布式ID的核心
- 构建机器码,机器码和服务所在机器的ip地址有关,初始化后一般无需改变:
InetAddress address;
try {
//获取本机IP
address = InetAddress.getLocalHost();
} catch (final UnknownHostException e) {
throw new IllegalStateException(“Cannot get LocalHost InetAddress, please check your network!”,e);
}
byte[] ipAddressByteArray = address.getAddress();
//机器码一共需要10位,所以取段倒数第二个段取最后2位 + 倒数第一段全部8位
return ((ipAddressByteArray[ipAddressByteArray.length - 2] & 0B11) << Byte.SIZE) + (ipAddressByteArray[ipAddressByteArray.length - 1] & 0xFF);
- 获取下一个ID
//当前时间戳
long timestamp = System.currentTimeMillis()
//如果当前时间戳 < 最后记录时间戳 ,则可能发生时钟回拨,异常中断
if (timestamp < lastTimestamp) {
throw new RuntimeException(String.format(
“clock moved backwards. Refusing to generate id for %d milliseconds”, lastTimestamp - timestamp));
}
//如果当前时间戳 == 最后记录时间戳
if (lastTimestamp == timestamp) {
//计算下一个序列号,这里&4095的作用是循环,因为到4096会变成0
sequence = (sequence + 1) & sequenceMask;
//如果下一个序列号==0,则说明同一时间戳内序列号以用完,设置下一时间戳为最后时间戳
if (sequence == 0) {
//该方法内部while循环直到当前时间>最后时间
timestamp = tilNextMillis(lastTimestamp);
}
} else {
sequence = 0L;
}
lastTimestamp = timestamp;
//时间戳和指定时间的差 左移 12+10 | 机器码 左移12 | 序列号
return ((timestamp - twepoch) << timestampLeftShift) | (workerId << workerIdShift) | sequence;
最后
金三银四到了,送上一个小福利!
a03fab5e56a57acb)收录**