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)甩给他相关推荐
- java redis id生成器_基于redis的分布式ID生成器
项目地址 基于redis的分布式ID生成器. 准备 首先,要知道redis的EVAL,EVALSHA命令: 原理 利用redis的lua脚本执行功能,在每个节点上通过lua脚本生成唯一ID. 生成的I ...
- hystrix原理_面试必问的SpringCloud实现原理图
引言 面试中面试官喜欢问组件的实现原理,尤其是常用技术,我们平时使用了SpringCloud还需要了解它的实现原理,这样不仅起到举一反三的作用,还能帮助轻松应对各种问题及有针对的进行扩展. 以下是&l ...
- 融云发送图片消息_IM消息ID技术专题(五):开源分布式ID生成器UidGenerator的技术实现...
1.引言 很多人一想到IM应用开发,第一印象就是"长连接"."socket"."保活"."协议"这些关键词,没错,这些确 ...
- 雪花算法id长度_【Java】分布式自增ID算法雪花算法 (snowflake,Java版)
作者:H__D 转载自: https://www.cnblogs.com/h--d/p/11342741.html 一般情况,实现全局唯一ID,有三种方案,分别是通过中间件方式.UUID.雪花算法. ...
- 简述ip地址的abc类如何划分_面试官问:讲讲IP地址的分配原理
网络模型介绍 在计算机网络中有著名的OSI七层协议体系结构,概念清楚,理论完整,但是它既复杂又不实用.TCP/IP体系结构则不同,得到了广泛的应用.最终结合OSI和TCP/IP的优点,采用了一种只有五 ...
- synchronized原理_面试必备—Synchronized 关键字使用、底层原理
在并发编程中存在线程安全问题,主要原因有: 1.存在共享数据 2.多线程共同操作共享数据 关键字synchronized可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块,同时synchro ...
- 生成唯一字符串算法_面试官问:在分布式场景,生成唯一ID,你有几种方案?...
来源:http://t.cn/RG0AW0a 说明:本文代码采用C#,重要的是理解解决方案,代码实现都是次要的. 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成I ...
- java执行sql文件_面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他
初识 MyBatis MyBatis 是第一个支持自定义 SQL.存储过程和高级映射的类持久框架.MyBatis 消除了大部分 JDBC 的样板代码.手动设置参数以及检索结果.MyBatis 能够支持 ...
- .jar中没有主清单属性_面试官问:为什么SpringBoot的 jar 可以直接运行?
点击上方蓝色字体,选择"设为星标" 优质文章,及时送达 来源 | https://urlify.cn/uQvIna SpringBoot提供了一个插件spring-boot-mav ...
最新文章
- 那些巨头公司的前端面试都喜欢问些什么?
- VS2010项目生成时提示错误“在证书存储区中找不到清单签名证书”?
- sybase 数据库恢复
- java jsoup解析html标签_jsoup解析html
- eclipse juno_Eclipse Juno上带有GlassFish的JavaEE 7
- 什么叫冷备用状态_新密5P加工中心冷油机生产厂家电话【瀚信德】
- java 调试_我最喜欢的Java调试技术
- Qt学习: QFileDialog和QMessageBox的用法和程序示例
- Python使用系统聚类方法进行数据分类案例一则
- Luogu1886 滑动窗口 /【模板】单调队列
- shine 插件_《SHINE》正式上线|GBZ将你带入重重的紫色迷雾中
- .mat转.tif 用于arcgis裁剪遥感图像
- iphone11屏比例_iPhone每一代的屏幕尺寸比例是多少
- Rasa中文聊天机器人开发指南(2):NLU篇
- 青云QingCloud:重剑无锋 大巧不工
- 判断方阵是否沿主对角线对称
- 用JAVA编写MD5大写32位加密
- Linux 追踪技术 ftrace 简介(一)
- UE4 靠近物体时显示文字,远离时文字消失
- x-studio(Lua调试器,粒子编辑器,UI编辑器,代码编辑器,csb恢复工具)