一、概述
项目是分布式的架构,需要设计一款分布式全局ID,参照了多种方案,博主最后基于snowflake的算法设计了一款自用ID生成器。具有以下优势:
- 保证分布式场景下生成的ID是全局唯一的
- 生成的全局ID整体上是呈自增趋势的
- 高性能,能快速产生ID
- 高可用,有一定的容错机制
二、基于数据库生成全局ID方案
- 结合数据库维护一个Sequence表,每当需要为某个表的新纪录生成ID时就从Sequence表中取出对应的nextid,将其+1后更新到数据库中以备下次使用。 适合于低并发的场景,因为在高并发下所有的插入都要访问该表,很容易造成性能瓶颈
基于数据库生成全局ID方案,我们的实现思路为:
Id生成流程介绍:
通过dubbo传入对应的业务标示的字符串,根据传入的业务标示找到从Sequence表找到对应已生成的id键值,自增后更新原表的数据后,返回生成的id结果
键值更新的sql为 insert into t3(xx,xx) on duplicate key update `xx`='XX';
根据字段值查询(有索引),如果不存在,则插入;否则更新。 不会出现死锁问题是 因为insert语句对于主键来说,插入的行不管有没有存在,都会只有行锁。行锁,仅会锁住一行或者正在被线程访问的任何几行,因此同一个表中的其他行可以并发线程访问;
Id使用流程介绍:
通过jar包提供接口,spring扫描注解
改进方案
三、基于snowflake生成全局ID方案
todo