我們用的不在列內(nèi),但有相似之處罚斗,求推廣妓蛮。
利用內(nèi)部線程維護(hù)一個(gè)Map<表名把敞,隊(duì)列>,隊(duì)列中存儲(chǔ)若干個(gè)連續(xù)的id纽疟,這些id來源于數(shù)據(jù)庫(kù)主鍵表(記錄每個(gè)表當(dāng)前主鍵最大值罐韩,比如user表在主鍵表中記錄為user,1200污朽,本地map緩存200個(gè)id伴逸,本地線程每10秒維護(hù)一次數(shù)據(jù),當(dāng)檢查到id數(shù)小于100時(shí)補(bǔ)齊200個(gè),id值以數(shù)據(jù)庫(kù)表中的值為基礎(chǔ)在本地遞增放入隊(duì)列错蝴,并將表中的值增加獲取的數(shù)量。程序獲取id直接從本地隊(duì)列獲取颓芭,如果沒有則調(diào)用補(bǔ)齊方法然后獲得id(補(bǔ)償機(jī)制顷锰,緩存量合適的話不會(huì)走到這里)。由于從本地隊(duì)列獲取亡问,效率非常高官紫。注意事項(xiàng)是:調(diào)用補(bǔ)齊方法需要使用集群鎖,避免兩個(gè)節(jié)點(diǎn)并發(fā)調(diào)用獲取到相同的id集合州藕。多個(gè)服務(wù)使用相同的機(jī)制束世。在趨勢(shì)上實(shí)現(xiàn)了遞增,重啟節(jié)點(diǎn)會(huì)有id區(qū)間中斷床玻。