1.简述
分布式应用业务增长至分表时,主键ID不能够依赖于数据库自增,这个时候需要借助于代码生成;分布式ID生成方法有雪花算法或Java的UUID等等;一般来说分布式ID最好是有序且增长的(像UUID无序会导致数据库的页分裂影响性能);咱们这里提供的分布式ID为32位由5个部分组成(17位时间戳 + 4位IP + 4位业务ID + 6位内存自增 + 1位随机数),这里可能6位内存自增有点难度,将详细描述。
2.分布式ID的5部分简述
- 17位时间戳
不做详细描述 - 4位IP
取本机内网IP后2段转16进制 - 4位业务ID
这里可自定义,比如所有表自己编个号,这里取4位编号即可 - 6位内存自增
简单的说就是6位的自增值 ,下一节详细描述 - 1位随机数
不做详细描述
3.Java实现6位内存自增
public interface Sequence {
/**
* 获取内存自增值
*/
String getMemoryInc();
}
/**
* 一个序列号生成器的程序同时会有多个线程访问它,要保证每个线程得到的序列号都是自增的,而相互不干扰
*/
public static class SequenceImpl implements Sequence {
/**
* 最大值
*/
private static final int MAX = 999999;
public static ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);
@Override
public String getMemoryInc() {
Integer cur = threadLocal.get();
if (cur == MAX) {
threadLocal.set(0);
} else {
threadLocal.set(cur + 1);
}
return String.format("%06d", cur);
}
}