产生唯一标识码策略

1.采用数据库自增长主键策略
优点:简单,不需要程序特别处理
缺点:①这种方法对以后如果项目移植到其它数据库上改动会比较大,oracle、db2采用Sequence,mysql、sqlServer又采用自增长,通用性不好;②后台 插入记录时,无法知道当前记录主键值

2.自己写代码产生随机的数字和字母组合,每产生1个去数据库查询该随机码是否已存在,如果已存在,则重新产生,直到不重复为止
优点:没发现有啥优点
缺点:产生速度慢,还要查询数据库,当数据量大的时候,可能重复的机率会比较高,要查询多次数据库

3.使用时间戳(精确至毫秒)+随机数
优点:实现简单,与数据库无关,移植性较好
缺点:长度太长,最少也得20位,不仅占空间并且建索引的话性能会比较差点

4.GUID,该方法应该是用的比较多的
优点:使用简单方便,不用自己编写额外的代码
缺点:占用数据库空间相对较大,特别是根据GUID查询速度比较慢(毕竟是字符串)

### 分布式系统中生成唯一ID的方法 在现代分布式系统中,生成唯一的标识符(ID)是一项基本需求。由于传统自增 ID 的局限性,在分布式环境下容易引发冲突,因此需要采用专门设计的全局唯一 ID 生成方法[^1]。 #### 方法一:基于时间戳和机器信息的 Snowflake 算法 Snowflake 是 Twitter 提出的一种高效生成全局唯一 ID 的算法。它通过组合多个字段来构建一个 64 位整型 ID: - **41 位时间戳**:表示毫秒级的时间差,能够覆盖约 69 年的时间范围。 - **10 位机器标识**:可以区分不同数据中心或服务器实例。 - **12 位序列号**:在同一毫秒内生成多个 ID 时提供增量支持。 这种方法的优点在于生成的 ID 不仅是全局唯一的,还具有一定的顺序性和可预测性,便于后续的数据处理和查询优化[^4]。 ```java public class Snowflake { private final long workerId; private final long datacenterId; public Snowflake(long workerId, long datacenterId) { this.workerId = workerId; this.datacenterId = datacenterId; } public synchronized long nextId() { // 实现逻辑省略... return id; } } ``` #### 方法二:数据库生成号段模式 另一种常见的方式是在数据库中维护一段连续的编号资源池,并分配给各个服务节点使用。具体来说,可以通过创建一张 `sequence` 表记录已使用的最大值,每次请求新的 ID 范围时更新该表并返回指定数量的可用号码。这种方式通常被称为 “号段模式”,其核心思想是以批量形式获取未来一段时间内的 ID 使用权限,从而减少频繁访问数据库带来的开销。 ```sql CREATE TABLE sequence ( name VARCHAR(50), current_value BIGINT, step INT DEFAULT 1000, PRIMARY KEY (name) ); -- 获取下一个号段 UPDATE sequence SET current_value = last_insert_id(current_value + step) WHERE name='order'; SELECT LAST_INSERT_ID(); ``` #### 方法三:UUID 和其他变体方案 虽然 UUID (通用唯一识别码)提供了几乎无限的可能性以确保不重复性,但由于它是随机产生的字符串而非数值类型,所以在某些场景下可能并不适合直接作为主键或者索引列使用。此外还有像 MongoDB 中使用的 ObjectID 这样的替代品,它们同样具备跨平台兼容性的特点却无法做到完全递增排列。 综上所述,针对不同的应用场景可以选择合适的策略来满足实际需求。如果追求高性能低延迟,则推荐考虑 SnowFlake 或者类似的定制化版本;而对于那些更看重简单易用性的场合而言,借助现有的成熟框架如 Leaf、UidGenerator 等也是不错的选择[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值