號段模式是當下分布式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生成方式不強依賴於數據庫,不會頻繁的訪問數據庫,對數據庫的壓力小很多
參考地址
