分布式如何生成唯一主键
| 描述 | 优点 | 缺点 |
UUID | UUID 通用唯一标识码缩写,其目是让分布式系统中所有元素都有唯一的辨识信息,而且不需要通过中央控制器来指定唯一标识 java.util.UUID.randomUUID().toString() , | 1)降低全局节点的压力,使得主键生成速度更快 2)生成的主键全局唯一 3)跨服务器合并数据方便 | 1)由于无序,检索效率低 2)UUID 占16字节,占用空间大 |
数据库主键自增 | Mysql表主键自增 | 1) INT 和BIGINT 占用空间小 2)顺序性好,检索性能好,索引的裂变 | 1)并发性能不高,受限于数据库性能 2)分库分表需要改造,复杂 3)由于自增,数据量会泄露 |
Redis自增 | Redis INT incre 自增保证原子性 | 1)速度快 2)并发能力好 | 1)由于内存存储,如果redis宕机会丢失 2) 由于自增,数据量会泄露 |
雪花算法 | 分布式经典应用 | 1)不依赖外部组件 2)性能好 3)有序性 | 时钟回拨 |
雪花算法 (snowFlake)
雪花算法生成的ID 8个字节64位
1,符号位 占1位(正负位)
2,时间戳 占用41位,时间戳的单位是毫秒 (支持69年的时间跨度)
3, 机器标识 占10位 支持1024部机器
4,序列号,占12位,一毫米可以生成0到4095,4096个ID
伪代码
Timestamp now
int sequence =0
Timestamp last=-1L
long ID
now= currentTime();
synchronized {
if(now <last)){
//clock is moving backwards.
throw exception
}else if(now == last){
sequence ++
if(sequence >4095){
now==currentTime()+1;
sequence =0
}else{
sequence =0;
last=now;
}
ID = now <<22 | workID<<12 | sequence
}
可以参考这个老哥写的雪花算法简介以及代码实现_不爱吃胡萝卜的阿丁的博客-CSDN博客_雪花编码