全局唯一ID设计
设计 ID 全局 唯一
2023-09-27 14:20:50 时间
1.用数据库自増字段
2.采用UUID
3.用uuid生成器
4.采用 Twitter Snowflake 的Id算法
单机系统用1,2,3,4,
分布式系统用2,3,4
分布式有序id用4
附上4的源码:
public class IdWorker { private final long twepoch = 1288834974657L; private final long workerIdBits = 5L; private final long datacenterIdBits = 5L; private final long maxWorkerId = -1L ^ (-1L << workerIdBits); private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); private final long sequenceBits = 12L; private final long workerIdShift = sequenceBits; private final long datacenterIdShift = sequenceBits + workerIdBits; private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; private final long sequenceMask = -1L ^ (-1L << sequenceBits); private long workerId; private long datacenterId; private long sequence = 0L; private long lastTimestamp = -1L; public IdWorker(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)); } if (datacenterId > maxDatacenterId || datacenterId < 0) { throw new IllegalArgumentException( String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); } this.workerId = workerId; this.datacenterId = datacenterId; } public synchronized long nextId() { long timestamp = timeGen(); if (timestamp < lastTimestamp) { throw new RuntimeException(String.format( "Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); } if (lastTimestamp == timestamp) { sequence = (sequence + 1) & sequenceMask; if (sequence == 0) { timestamp = tilNextMillis(lastTimestamp); } } else { sequence = 0L; } lastTimestamp = timestamp; return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) | (workerId << workerIdShift) | sequence; } protected long tilNextMillis(long lastTimestamp) { long timestamp = timeGen(); while (timestamp <= lastTimestamp) { timestamp = timeGen(); } return timestamp; } protected long timeGen() { return System.currentTimeMillis(); } public static void main(String[] args) { IdWorker idWorker = new IdWorker(0, 17); for (int i = 0; i < 10; i++) { long id = idWorker.nextId(); System.out.println(id); } } }
相关文章
- 电动汽车充电站监控系统设计_kaic
- 系统设计之图状数据模型
- 三层架构介绍和MVC设计模型介绍
- Android UI设计系统---LayoutParams[转]
- Java架构师-分布式(八):数据库表全局唯一主键id设计、分布式事务、数据一致性
- CorelDRAW2023最新版矢量设计软件
- 社区便利店销售微信APP的设计与实现(源码+论文)_kaic
- 基于Python的药店|药房管理系统的设计和实现
- 基于javaweb停车场管理系统的设计与实现
- PPT资料下载 - 问题驱动的软件测试设计:强化测试用例设计
- 10个有关RESTful API良好设计的最佳实践(转)
- 数据库设计那些事儿
- golang web框架设计3:controller设计
- BPM.NET设计器,流程控制的能力-SEO狼术