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

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

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

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

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

jf_ro2CN3Fa ? 來源:芋道源碼 ? 2023-09-14 15:42 ? 次閱讀


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

Tinyid的特性

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

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

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

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

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

Tinyid原理

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

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

原理圖大致如下圖:

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

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

  • 項目地址: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ù)類型,唯一',
`begin_id`bigint(20)NOTNULLDEFAULT'0'COMMENT'開始id,僅記錄初始值,無其他含義。初始化時begin_id和max_id應(yīng)相同',
`max_id`bigint(20)NOTNULLDEFAULT'0'COMMENT'當(dāng)前最大id',
`step`int(11)DEFAULT'0'COMMENT'步長',
`delta`int(11)NOTNULLDEFAULT'1'COMMENT'每次id增量',
`remainder`int(11)NOTNULLDEFAULT'0'COMMENT'余數(shù)',
`create_time`timestampNOTNULLDEFAULT'2010-01-010000'COMMENT'創(chuàng)建時間',
`update_time`timestampNOTNULLDEFAULT'2010-01-010000'COMMENT'更新時間',
`version`bigint(20)NOTNULLDEFAULT'0'COMMENT'版本號',
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可訪問的業(yè)務(wù)類型標(biāo)識',
`remark`varchar(255)NOTNULLDEFAULT''COMMENT'備注',
`create_time`timestampNOTNULLDEFAULT'2010-01-010000'COMMENT'創(chuàng)建時間',
`update_time`timestampNOTNULLDEFAULT'2010-01-010000'COMMENT'更新時間',
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ù)方號段信息數(shù)據(jù)表

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

max_id :號段的最大值

step:步長,即為號段的長度

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

號段獲取對max_id字段做一次update操作,update max_id= max_id + step,更新成功則說明新號段獲取成功,新的號段范圍是(max_id ,max_id +step]

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

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

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

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)部一共提供了四個http接口來獲取ID和號段。

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都是獲取下一個ID,nextSegmentIdSimplegetNextSegmentId是獲取下一個可用號段。區(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客戶端

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

引用 tinyid-server


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

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

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

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

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

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

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

Tinyid整個項目的源碼實(shí)現(xiàn)也是比較簡單,像與數(shù)據(jù)庫交互更直接用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為本地生成,號段長度(step)越長,支持的qps就越大,如果將號段設(shè)置足夠大,則qps可達(dá)1000w+。而且tinyid-clienttinyid-server 訪問變的低頻,減輕了server端的壓力。


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

    關(guān)注

    7

    文章

    3799

    瀏覽量

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

    關(guān)注

    7

    文章

    315

    瀏覽量

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

    關(guān)注

    1

    文章

    290

    瀏覽量

    16687

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

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

收藏 人收藏

    評論

    相關(guān)推薦

    Minitab 交互表格生成器

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

    ID生成器的snowflake

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

    python生成器

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

    pim卡資料生成器

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

    自制酸奶生成器

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

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

    jeesite框架代碼生成器,可以很方便的生成代碼,挺不錯的。
    發(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 ?40次下載

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

    STM32庫函數(shù)代碼自動生成器正式版 STM32庫函數(shù)代碼自動生成器正式版
    發(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 ),是個可以像迭代器那樣使用for循環(huán)來獲取元素的函數(shù)。 生成器
    的頭像 發(fā)表于 02-24 15:53 ?3663次閱讀

    Arduino贊美生成器

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

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

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

    通用RFID生成器

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

    TSMaster報文發(fā)送的信號生成器操作說明

    信號生成器功能是TSMaster分析中的報文發(fā)送模塊。信號生成器用于發(fā)送和配置每個CAN/LIN信號的值變化行為,簡而言之,這是個可以控制和調(diào)整CAN/LIN信號值的功能。我們可選擇的信號
    的頭像 發(fā)表于 12-23 08:21 ?1012次閱讀
    TSMaster報文發(fā)送的信號<b class='flag-5'>生成器</b>操作說明
    主站蜘蛛池模板: 天天弄天天模| 七月色婷婷| 性欧美久久| 欧美日韩国产另类一区二区三区| 老色视频| 天天av天天翘天天综合网| 69xxx网站| 综合第一页| 天堂伊人| 欧美成人精品欧美一级乱黄| 夜夜骚视频| 夜夜狠狠| 亚欧色| 国产成人在线网址| 日本加勒比在线精品视频| 日本亚洲视频| 两性色午夜视频免费播放| 欧美成人午夜片一一在线观看| 欧美ol丝袜高跟秘书在线观看| 九九免费久久这里有精品23| 女人夜夜春| 亚洲手机看片| 干成人网| 特级无码毛片免费视频尤物| 久久久久免费精品国产| 美女被免费网站91色| 亚洲色图综合在线| 女性一级全黄生活片在线播放| 欧美黄色免费看| 亚洲色图欧美在线| 久精品视频村上里沙| www.夜夜| 三及毛片| 男人的网址| 九九热精品在线视频| 好吊色青青青国产在线观看| 日日舔夜夜操| 欧美一卡二卡3卡4卡无卡六卡七卡科普 | 欧美性video精品| 在线免费看片a| 日本在线不卡免费|