在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

滴滴的分布式ID生成器,好用的一批!

jf_ro2CN3Fa ? 來(lái)源:芋道源碼 ? 2023-09-14 15:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


Tinyid是滴滴開(kāi)發(fā)的一款分布式ID系統(tǒng),Tinyid是在美團(tuán)(Leaf)leaf-segment算法基礎(chǔ)上升級(jí)而來(lái),不僅支持了數(shù)據(jù)庫(kù)多主節(jié)點(diǎn)模式,還提供了tinyid-client客戶端的接入方式,使用起來(lái)更加方便。但和美團(tuán)(Leaf)不同的是,Tinyid只支持號(hào)段一種模式不支持雪花模式。

Tinyid的特性

  • 全局唯一的long型ID
  • 趨勢(shì)遞增的id
  • 提供 http 和 java-client 方式接入
  • 支持批量獲取ID
  • 支持生成1,3,5,7,9...序列的ID
  • 支持多個(gè)db的配置

適用場(chǎng)景 :只關(guān)心ID是數(shù)字,趨勢(shì)遞增的系統(tǒng),可以容忍ID不連續(xù),可以容忍ID的浪費(fèi)

不適用場(chǎng)景 :像類(lèi)似于訂單ID的業(yè)務(wù),因生成的ID大部分是連續(xù)的,容易被掃庫(kù)、或者推算出訂單量等信息

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

Tinyid原理

Tinyid是基于號(hào)段模式實(shí)現(xiàn),再簡(jiǎn)單啰嗦一下號(hào)段模式的原理:就是從數(shù)據(jù)庫(kù)批量的獲取自增ID,每次從數(shù)據(jù)庫(kù)取出一個(gè)號(hào)段范圍,例如 (1,1000] 代表1000個(gè)ID,業(yè)務(wù)服務(wù)將號(hào)段在本地生成1~1000的自增ID并加載到內(nèi)存.。

Tinyid會(huì)將可用號(hào)段加載到內(nèi)存中,并在內(nèi)存中生成ID,可用號(hào)段在首次獲取ID時(shí)加載,如當(dāng)前號(hào)段使用達(dá)到一定比例時(shí),系統(tǒng)會(huì)異步的去加載下一個(gè)可用號(hào)段,以此保證內(nèi)存中始終有可用號(hào)段,以便在發(fā)號(hào)服務(wù)宕機(jī)后一段時(shí)間內(nèi)還有可用ID。

原理圖大致如下圖:

dcb852c4-52c5-11ee-a25d-92fbcf53809c.pngTinyid原理圖

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

Tinyid實(shí)現(xiàn)

Tinyid的GitHub地址 :https://github.com/didi/tinyid.git

Tinyid提供了兩種調(diào)用方式,一種基于Tinyid-server提供的http方式,另一種Tinyid-client客戶端方式。不管使用哪種方式調(diào)用,搭建Tinyid都必須提前建表tiny_id_infotiny_id_token

CREATETABLE`tiny_id_info`(
`id`bigint(20)unsignedNOTNULLAUTO_INCREMENTCOMMENT'自增主鍵',
`biz_type`varchar(63)NOTNULLDEFAULT''COMMENT'業(yè)務(wù)類(lèi)型,唯一',
`begin_id`bigint(20)NOTNULLDEFAULT'0'COMMENT'開(kāi)始id,僅記錄初始值,無(wú)其他含義。初始化時(shí)begin_id和max_id應(yīng)相同',
`max_id`bigint(20)NOTNULLDEFAULT'0'COMMENT'當(dāng)前最大id',
`step`int(11)DEFAULT'0'COMMENT'步長(zhǎng)',
`delta`int(11)NOTNULLDEFAULT'1'COMMENT'每次id增量',
`remainder`int(11)NOTNULLDEFAULT'0'COMMENT'余數(shù)',
`create_time`timestampNOTNULLDEFAULT'2010-01-010000'COMMENT'創(chuàng)建時(shí)間',
`update_time`timestampNOTNULLDEFAULT'2010-01-010000'COMMENT'更新時(shí)間',
`version`bigint(20)NOTNULLDEFAULT'0'COMMENT'版本號(hào)',
PRIMARYKEY(`id`),
UNIQUEKEY`uniq_biz_type`(`biz_type`)
)ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8COMMENT'id信息表';

CREATETABLE`tiny_id_token`(
`id`int(11)unsignedNOTNULLAUTO_INCREMENTCOMMENT'自增id',
`token`varchar(255)NOTNULLDEFAULT''COMMENT'token',
`biz_type`varchar(63)NOTNULLDEFAULT''COMMENT'此token可訪問(wèn)的業(yè)務(wù)類(lèi)型標(biāo)識(shí)',
`remark`varchar(255)NOTNULLDEFAULT''COMMENT'備注',
`create_time`timestampNOTNULLDEFAULT'2010-01-010000'COMMENT'創(chuàng)建時(shí)間',
`update_time`timestampNOTNULLDEFAULT'2010-01-010000'COMMENT'更新時(shí)間',
PRIMARYKEY(`id`)
)ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8COMMENT'token信息表';

INSERTINTO`tiny_id_info`(`id`,`biz_type`,`begin_id`,`max_id`,`step`,`delta`,`remainder`,`create_time`,`update_time`,`version`)
VALUES
(1,'test',1,1,100000,1,0,'2018-07-212358','2018-07-222327',1);

INSERTINTO`tiny_id_info`(`id`,`biz_type`,`begin_id`,`max_id`,`step`,`delta`,`remainder`,`create_time`,`update_time`,`version`)
VALUES
(2,'test_odd',1,1,100000,2,1,'2018-07-212358','2018-07-230024',3);


INSERTINTO`tiny_id_token`(`id`,`token`,`biz_type`,`remark`,`create_time`,`update_time`)
VALUES
(1,'0f673adf80504e2eaa552f5d791b644c','test','1','2017-12-141646','2017-12-141648');

INSERTINTO`tiny_id_token`(`id`,`token`,`biz_type`,`remark`,`create_time`,`update_time`)
VALUES
(2,'0f673adf80504e2eaa552f5d791b644c','test_odd','1','2017-12-141646','2017-12-141648');

tiny_id_info表是具體業(yè)務(wù)方號(hào)段信息數(shù)據(jù)表

dcff08cc-52c5-11ee-a25d-92fbcf53809c.png

max_id :號(hào)段的最大值

step:步長(zhǎng),即為號(hào)段的長(zhǎng)度

biz_type:業(yè)務(wù)類(lèi)型

號(hào)段獲取對(duì)max_id字段做一次update操作,update max_id= max_id + step,更新成功則說(shuō)明新號(hào)段獲取成功,新的號(hào)段范圍是(max_id ,max_id +step]

tiny_id_token是一個(gè)權(quán)限表,表示當(dāng)前token可以操作哪些業(yè)務(wù)的號(hào)段信息。

dd1d31ee-52c5-11ee-a25d-92fbcf53809c.png

修改tinyid-serverofflineapplication.properties 文件配置數(shù)據(jù)庫(kù),由于tinyid支持?jǐn)?shù)據(jù)庫(kù)多master模式,可以配置多個(gè)數(shù)據(jù)庫(kù)信息。啟動(dòng) TinyIdServerApplication 測(cè)試一下。

datasource.tinyid.primary.driver-class-name=com.mysql.jdbc.Driver
datasource.tinyid.primary.url=jdbc//127.0.0.1:3306/xin-master?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
datasource.tinyid.primary.username=junkang
datasource.tinyid.primary.password=junkang
datasource.tinyid.primary.testOnBorrow=false
datasource.tinyid.primary.maxActive=10

datasource.tinyid.secondary.driver-class-name=com.mysql.jdbc.Driver
datasource.tinyid.secondary.url=jdbc//localhost:3306/db2?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
datasource.tinyid.secondary.username=root
datasource.tinyid.secondary.password=123456
datasource.tinyid.secondary.testOnBorrow=false
datasource.tinyid.secondary.maxActive=10

1、Http方式

tinyid內(nèi)部一共提供了四個(gè)http接口來(lái)獲取ID和號(hào)段。

packagecom.xiaoju.uemc.tinyid.server.controller;

/**
*@authordu_imba
*/
@RestController
@RequestMapping("/id/")
publicclassIdContronller{

privatestaticfinalLoggerlogger=LoggerFactory.getLogger(IdContronller.class);
@Autowired
privateIdGeneratorFactoryServeridGeneratorFactoryServer;
@Autowired
privateSegmentIdServicesegmentIdService;
@Autowired
privateTinyIdTokenServicetinyIdTokenService;
@Value("${batch.size.max}")
privateIntegerbatchSizeMax;

@RequestMapping("nextId")
publicResponse>nextId(StringbizType,IntegerbatchSize,Stringtoken){
Response>response=newResponse<>();
try{
IdGeneratoridGenerator=idGeneratorFactoryServer.getIdGenerator(bizType);
Listids=idGenerator.nextId(newBatchSize);
response.setData(ids);
}catch(Exceptione){
response.setCode(ErrorCode.SYS_ERR.getCode());
response.setMessage(e.getMessage());
logger.error("nextIderror",e);
}
returnresponse;
}



@RequestMapping("nextIdSimple")
publicStringnextIdSimple(StringbizType,IntegerbatchSize,Stringtoken){
Stringresponse="";
try{
IdGeneratoridGenerator=idGeneratorFactoryServer.getIdGenerator(bizType);
if(newBatchSize==1){
Longid=idGenerator.nextId();
response=id+"";
}else{
ListidList=idGenerator.nextId(newBatchSize);
StringBuildersb=newStringBuilder();
for(Longid:idList){
sb.append(id).append(",");
}
response=sb.deleteCharAt(sb.length()-1).toString();
}
}catch(Exceptione){
logger.error("nextIdSimpleerror",e);
}
returnresponse;
}

@RequestMapping("nextSegmentId")
publicResponsenextSegmentId(StringbizType,Stringtoken){
try{
SegmentIdsegmentId=segmentIdService.getNextSegmentId(bizType);
response.setData(segmentId);
}catch(Exceptione){
response.setCode(ErrorCode.SYS_ERR.getCode());
response.setMessage(e.getMessage());
logger.error("nextSegmentIderror",e);
}
returnresponse;
}

@RequestMapping("nextSegmentIdSimple")
publicStringnextSegmentIdSimple(StringbizType,Stringtoken){
Stringresponse="";
try{
SegmentIdsegmentId=segmentIdService.getNextSegmentId(bizType);
response=segmentId.getCurrentId()+","+segmentId.getLoadingId()+","+segmentId.getMaxId()
+","+segmentId.getDelta()+","+segmentId.getRemainder();
}catch(Exceptione){
logger.error("nextSegmentIdSimpleerror",e);
}
returnresponse;
}

}

nextIdnextIdSimple都是獲取下一個(gè)ID,nextSegmentIdSimplegetNextSegmentId是獲取下一個(gè)可用號(hào)段。區(qū)別在于接口是否有返回狀態(tài)。

nextId:
'http://localhost:9999/tinyid/id/nextId?bizType=test&token=0f673adf80504e2eaa552f5d791b644c'
response :
{
"data":[2],
"code":200,
"message":""
}

nextIdSimple:
'http://localhost:9999/tinyid/id/nextIdSimple?bizType=test&token=0f673adf80504e2eaa552f5d791b644c'
response:3
dd35e23e-52c5-11ee-a25d-92fbcf53809c.pngdd56e434-52c5-11ee-a25d-92fbcf53809c.png

2、Tinyid-client客戶端

如果不想通過(guò)http方式,Tinyid-client客戶端也是一種不錯(cuò)的選擇。

引用 tinyid-server


com.xiaoju.uemc.tinyid
tinyid-client
${tinyid.version}

啟動(dòng) tinyid-server項(xiàng)目打包后得到 tinyid-server-0.1.0-SNAPSHOT.jar ,設(shè)置版本 ${tinyid.version}為0.1.0-SNAPSHOT。

在我們的項(xiàng)目 application.properties 中配置 tinyid-server服務(wù)的請(qǐng)求地址 和 用戶身份token

tinyid.server=127.0.0.1:9999
tinyid.token=0f673adf80504e2eaa552f5d791b644c```

在Java代碼調(diào)用TinyId也很簡(jiǎn)單,只需要一行代碼。

//根據(jù)業(yè)務(wù)類(lèi)型獲取單個(gè)ID
Longid=TinyId.nextId("test");

//根據(jù)業(yè)務(wù)類(lèi)型批量獲取10個(gè)ID
Listids=TinyId.nextId("test",10);

Tinyid整個(gè)項(xiàng)目的源碼實(shí)現(xiàn)也是比較簡(jiǎn)單,像與數(shù)據(jù)庫(kù)交互更直接用jdbcTemplate實(shí)現(xiàn)

@Override
publicTinyIdInfoqueryByBizType(StringbizType){
Stringsql="selectid,biz_type,begin_id,max_id,"+
"step,delta,remainder,create_time,update_time,version"+
"fromtiny_id_infowherebiz_type=?";
Listlist=jdbcTemplate.query(sql,newObject[]{bizType},newTinyIdInfoRowMapper());
if(list==null||list.isEmpty()){
returnnull;
}
returnlist.get(0);
}

總結(jié)

兩種方式推薦使用Tinyid-client,這種方式ID為本地生成,號(hào)段長(zhǎng)度(step)越長(zhǎng),支持的qps就越大,如果將號(hào)段設(shè)置足夠大,則qps可達(dá)1000w+。而且tinyid-client 對(duì) tinyid-server 訪問(wèn)變的低頻,減輕了server端的壓力。


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3917

    瀏覽量

    66088
  • 生成器
    +關(guān)注

    關(guān)注

    7

    文章

    322

    瀏覽量

    21833
  • 客戶端
    +關(guān)注

    關(guān)注

    1

    文章

    301

    瀏覽量

    17064

原文標(biāo)題:滴滴的分布式ID生成器,好用的一批!

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Minitab 交互表格生成器

    生成器
    MinitabUG
    發(fā)布于 :2024年04月03日 15:58:54

    ID生成器的snowflake

    那些驚艷的算法們(四)——唯ID生成器snowflake
    發(fā)表于 06-12 17:22

    python生成器

    python生成器1. 什么是生成器生成器(英文名 Generator ),是個(gè)可以像迭代器那樣使用for循環(huán)來(lái)獲取元素的函數(shù)。生成器
    發(fā)表于 02-24 15:56

    pim卡資料生成器

    pim卡資料生成器
    發(fā)表于 11-22 23:23 ?6次下載

    自制酸奶生成器

    自制酸奶生成器
    發(fā)表于 04-23 11:48 ?977次閱讀
    自制酸奶<b class='flag-5'>生成器</b>

    代碼生成器的應(yīng)用

    jeesite框架代碼生成器,可以很方便的生成代碼,挺不錯(cuò)的。
    發(fā)表于 01-14 15:19 ?0次下載

    FPM_0.080_ALLEGRO_封裝生成器

    ALLEGRO PCB 封裝生成器好用的東東
    發(fā)表于 02-19 14:38 ?0次下載

    數(shù)碼管代碼生成器

    數(shù)碼管代碼生成器,迅速生成數(shù)碼管的相應(yīng)代碼
    發(fā)表于 04-25 10:54 ?44次下載

    STM32庫(kù)函數(shù)代碼自動(dòng)生成器正式版

    STM32庫(kù)函數(shù)代碼自動(dòng)生成器正式版 STM32庫(kù)函數(shù)代碼自動(dòng)生成器正式版
    發(fā)表于 07-25 18:52 ?0次下載

    AN-113:精密坡道生成器

    AN-113:精密坡道生成器
    發(fā)表于 05-16 12:04 ?6次下載
    AN-113:精密坡道<b class='flag-5'>生成器</b>

    python生成器是什么

    python生成器 1. 什么是生成器生成器(英文名 Generator ),是個(gè)可以像迭代器那樣使用for循環(huán)來(lái)獲取元素的函數(shù)。 生成器
    的頭像 發(fā)表于 02-24 15:53 ?3931次閱讀

    Arduino贊美生成器

    電子發(fā)燒友網(wǎng)站提供《Arduino贊美生成器.zip》資料免費(fèi)下載
    發(fā)表于 11-09 14:22 ?1次下載
    Arduino贊美<b class='flag-5'>生成器</b>

    為什么需要分布式ID?求分布式ID生成方案

    對(duì)于單體系統(tǒng)來(lái)說(shuō),主鍵ID可能會(huì)常用主鍵自動(dòng)的方式進(jìn)行設(shè)置,這種ID生成方法在單體項(xiàng)目是可行的,但是對(duì)于分布式系統(tǒng),分庫(kù)分表之后,就不適應(yīng)了
    的頭像 發(fā)表于 01-09 10:43 ?1557次閱讀

    通用RFID生成器

    通用RFID生成器資料分享
    發(fā)表于 02-10 15:35 ?1次下載

    Python中的迭代器與生成器

    Python迭代器與生成器 列表生成 列表生成也叫做列表推導(dǎo),它本身還是列表,只不過(guò)它是根
    的頭像 發(fā)表于 02-20 10:43 ?370次閱讀
    主站蜘蛛池模板: 狠狠色噜噜狠狠狠 | 天堂网免费 | 欧美人另类zooz | 天天久久综合网站 | 亚洲色啦啦狠狠网站 | 色中色官网 | 91精品久久国产青草 | 欧美日韩性大片 | brazzersvideosex欧美最 | 日本特黄视频 | 久久综合九色欧美综合狠狠 | 亚洲第一成网站 | 不卡无毒免费毛片视频观看 | 欧美爱爱网 | 日本黄色网址大全 | 精品无码三级在线观看视频 | www.av123| 欧美性色xo影院69 | 色日韩在线 | 欧美性黄色| 起碰免费视频 | 511韩国理论片在线观看 | bt 另类 专区 欧美 制服 | 狠狠躁夜夜躁人人爽天天3 狠狠躁夜夜躁人人爽天天段 | 久久噜噜噜久久亚洲va久 | 在线观看高清免费播放 | 手机在线看片你懂的 | 激情综合五月天丁香婷婷 | 特级毛片a级毛免费播放 | 成年人的毛片 | 九九免费久久这里有精品23 | 久草资源免费 | 天天爱夜夜 | 老师啊灬啊灬用力啊快224视频 | 久久久久国产精品免费免费 | 欧美四级在线 | 午夜一级毛片 | 一级做a爱免费观看视频 | 国产精品福利一区二区亚瑟 | 亚洲乱码一二三四区 | 亚洲欧美高清 |