日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jdbc 自增id 原理_面试被问分布式ID怎么办? 滴滴(Tinyid)甩给他

發布時間:2024/1/23 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jdbc 自增id 原理_面试被问分布式ID怎么办? 滴滴(Tinyid)甩给他 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊“?程序員內點事?”關注,選擇“?設置星標?”

堅持學習,好文每日送達!

引言

接著《一口氣說出 9種 分布式ID生成方式,面試官有點懵了》來繼續詳細的介紹分布式ID生成器,大家比較感興趣的美團(Leaf)、滴滴(Tinyid)、百度(uid-generator)三個開源項目,美團(Leaf)已經講完,詳見《9種分布式ID生成之美團(Leaf)實戰》,今天結合實戰搞一下滴滴開源的(Tinyid)。

Tinyid介紹

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

Tinyid的特性
  • 全局唯一的long型ID

  • 趨勢遞增的id

  • 提供 http 和 java-client 方式接入

  • 支持批量獲取ID

  • 支持生成1,3,5,7,9…序列的ID

  • 支持多個db的配置

適用場景:只關心ID是數字,趨勢遞增的系統,可以容忍ID不連續,可以容忍ID的浪費

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


Tinyid原理

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

Tinyid會將可用號段加載到內存中,并在內存中生成ID,可用號段在首次獲取ID時加載,如當前號段使用達到一定比例時,系統會異步的去加載下一個可用號段,以此保證內存中始終有可用號段,以便在發號服務宕機后一段時間內還有可用ID。

原理圖大致如下圖:

在這里插入圖片描述

Tinyid實現

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

Tinyid提供了兩種調用方式,一種基于Tinyid-server提供的http方式,另一種Tinyid-client客戶端方式。
不管使用哪種方式調用,搭建Tinyid都必須提前建表tiny_id_info、tiny_id_token。

1

tiny_id_info表是具體業務方號段信息數據表

在這里插入圖片描述

max_id?:號段的最大值

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

biz_type:業務類型

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

tiny_id_token是一個權限表,表示當前token可以操作哪些業務的號段信息。

在這里插入圖片描述

修改tinyid-server中?\offline\application.properties?文件配置數據庫,由于tinyid支持數據庫多master模式,可以配置多個數據庫信息。啟動?TinyIdServerApplication?測試一下。

1datasource.tinyid.primary.driver-class-name=com.mysql.jdbc.Driver
1、Http方式

tinyid內部一共提供了四個http接口來獲取ID和號段。

1

nextId、nextIdSimple都是獲取下一個ID,nextSegmentIdSimple、getNextSegmentId是獲取下一個可用號段。區別在于接口是否有返回狀態。

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

nextId?Simple:
'http://localhost:9999/tinyid/id/nextIdSimple?bizType=test&token=0f673adf80504e2eaa552f5d791b644c'
response:?3
在這里插入圖片描述在這里插入圖片描述
2、Tinyid-client客戶端

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

引用?tinyid-server包

1

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

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

1tinyid.server=

在Java代碼調用TinyId也很簡單,只需要一行代碼。

1??

Tinyid整個項目的源碼實現也是比較簡單,像與數據庫交互更直接用jdbcTemplate實現

1@Override

總結

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

往期精彩回顧

為了不復制粘貼,我被逼著學會了JAVA爬蟲

一口氣說出 9種 分布式ID生成方式,面試官有點懵了

面試總被問分庫分表怎么辦?這些知識點你要懂

Redis 5種數據結構及對應使用場景,全會面試要加分的

基于 Java 實現的人臉識別功能(附源碼)

技術/面試/吐槽

程序員內點事這都有

長按掃碼可關注

在看點這里

總結

以上是生活随笔為你收集整理的jdbc 自增id 原理_面试被问分布式ID怎么办? 滴滴(Tinyid)甩给他的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。