還可以使用號段的方式來獲取自增 id,號段可以理解成批量獲取。比如從資料庫獲取 id 時,就可以批量獲取多個 id 並快取在本地,提公升效率。
比如每次從資料庫獲取 id 時,就獲取乙個號段,如 (1,1000],這個範圍表示1000個 id,業務應用在請求提供 id 時,只需要在本地從1開始自增並返回,而不需要每次都取請求資料庫,一直到本地自增到1000時,也就是當前號段已經用完了,才去資料庫重新獲取下一號段。
對資料庫表進行改動如下:
create table test (
id int(10) not null,
current_max_id bigint(20) not null comment '當前最大id',
increment_step int(10) not null comment '號段的長度',
primary key (`id`)
) engine=innodb default charset=utf8;
這個資料表是用來記錄自增步長,以及當前自增 id 的最大值(也就是當前已被申請號段的最後那個值),而自增邏輯就移動到業務裡頭去實現,所以資料庫不需要這部分邏輯。
這種方案不再強依賴資料庫,就算資料庫不可用,那麼系統也能繼續支撐一段時間,但如果系統重啟,就會丟失一段 id,導致 id 空洞。
為提高可用性,需要做乙個集群,業務在請求集群獲取 id 時,會隨機的選擇某個節點進行獲取,對每個節點來說,資料庫連線的是同個資料庫,那麼就可能會產生多個節點同時請求資料庫獲取號段,這時就可以利用樂觀鎖來進行控制,比如在資料庫表中增加乙個 version 字段,在獲取號段時使用如下 sql:
update test set current_max_id = #, version = version+1 where version = #
以上 newmaxid 是根據oldmaxid + 步長
算出來的,只要上面的 update 更新成功,也就表示號段獲取成功。 資料庫 ID 生成方案 Redis
使用 redis 來生成分布式 id,其實和利用 mysql 自增 id 類似,可以利用 redis 中的 incr 命令來實現原子性的自增與返回,比如 127.0.0.1 6379 set id 1 初始化自增 id 為1 ok127.0.0.1 6379 incr id 增加1,並返回 inte...
資料庫 ID 生成方案 資料庫多主模式
將兩個資料庫組成主從模式的集群,正常情況下,是可以解決資料庫的可靠性問題,但如果主庫掛掉後,資料沒有及時同步到從庫,這個時候就會出現 id 重複的問題。可以使用雙主模式集群,也就是兩個例項都能單獨的生產自增id,這樣能夠提高效率,不過就需要單獨給每個資料庫例項配置不同的起始值和自增步長。第一台 my...
基於資料庫構建分布式的ID生成方案
在分布式系統中,生成全域性唯一id,有很多種方案,但是在這多種方案中,每種方案都有有缺點,下面我們之針對通過常用資料庫來生成分布式id的方案,其它方法會在其它文中討論 這裡我們討論mysql生成id。因為mysql本身可以auto increment和auto increment offset來保證...