不依赖数据库。
详细理解原理
(1)写文件。提前取1000个,然后将下一个值写入文件。
(2)预取+时间戳+线程好+机器码
时间时钟怎么保持一致?
id 递增的线程安全,持久化。
基础知识
网卡 线程 并发安全 持久化 (如果递增)
位运算,进制转换。
常见参考实现
UUID
GUID
timestampe+randomNum
snowflake
2018年9月5日小于 1 分钟
不依赖数据库。
(1)写文件。提前取1000个,然后将下一个值写入文件。
(2)预取+时间戳+线程好+机器码
时间时钟怎么保持一致?
id 递增的线程安全,持久化。
网卡 线程 并发安全 持久化 (如果递增)
位运算,进制转换。
UUID
GUID
timestampe+randomNum
snowflake
@Override
public String genId() {
return UUID.randomUUID().toString()
.replaceAll(PunctuationConst.MIDDLE_LINE, PunctuationConst.EMPTY);
}
package com.github.houbb.heaven.util.id.impl;
import com.github.houbb.heaven.annotation.ThreadSafe;
import com.github.houbb.heaven.util.id.Id;
import com.github.houbb.heaven.util.util.DateUtil;
import com.github.houbb.heaven.util.util.RandomUtil;
import java.util.Date;
/**
* 基于随机数生成的随机数字标识
*
* 组成方式:前缀+15位时间戳+后续随机数字
*
* 重复概率:1 Mills 内重复的概率为 1/(10)^10
*
* 应用场景:平时生成随机的标识。
*
* 优点:便于阅读,生成方便。
* 缺点:重复的概率和后续随机的长度有关,有时候可能会过长。
*
* @author binbin.hou
* @since 0.1.12
* @see com.github.houbb.heaven.util.util.DateUtil#TIMESTAMP_FORMAT_15 15 位时间戳
*/
@ThreadSafe
public class RandomNumId implements Id {
@Override
public String genId() {
final int randomLength = 10;
final String timestamp = DateUtil.getDateFormat(new Date(), DateUtil.TIMESTAMP_FORMAT_15);
return timestamp+ RandomUtil.randomNumber(randomLength);
}
}