基于数据库的号段模式生成分布式ID

号段模式是当下分布式ID生成器的主流实现方式之一 ,号段模式可以理解成从数据库批量获取ID。将ID缓存在本地,提升效率。

比如每次从数据库获取ID时,就获取一个号段,如(1,1000],这个范围表示1000个ID,业务应用在请求提供ID时,只需要在本地从1开始自增并返回,而不需要每次去请求数据库,一直到本地自增到1000时,也就是当前号段已经用完了,才去数据库重新获取下一号段。

CREATE TABLE id_generator (
  id int(10) NOT NULL,
  max_id bigint(20) NOT NULL COMMENT '当前最大id',
  step int(20) NOT NULL COMMENT '号段的步长',
  biz_type    int(20) NOT NULL COMMENT '业务类型',
  version int(20) NOT NULL COMMENT '版本号',
  PRIMARY KEY (`id`)
)  

biz_type : 代表不同业务类型

max_id : 当前最大的可用id

step : 代表号段的长度

version : 是一个乐观锁,每次都更新version,保证并发时数据的正确性

id   biz_type   max_id   step   version  
1 101 1000 2000 0

等这批号段ID用完,再次向数据库申请新号段,对max_id字段做一次update操作 , update max_id = max_id + step ,update成功则说明新号段获取成功,新的号段范围是(max_id,max_id+step)。

update id_generator set max_id = #{max_id+step}, version = version + 1 where version = # {version} and biz_type = XXX

由于多业务端可能同时操作,所以采用的版本号version乐观锁方式更新,这种分布式ID生成方式不强依赖于数据库,不会频繁的访问数据库,对数据库的压力小很多

参考地址 

https://www.jianshu.com/p/03d0fdea45f6

原文地址:https://www.cnblogs.com/kiko2014551511/p/13129239.html