点击“ 程序员内点事 ”关注,选择“ 设置星标 ”

坚持学习,好文每日送达!

引言

接着《一口气说出 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_infotiny_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

nextIdnextIdSimple都是获取下一个ID,nextSegmentIdSimplegetNextSegmentId是获取下一个可用号段。区别在于接口是否有返回状态。

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)甩给他相关推荐

  1. java redis id生成器_基于redis的分布式ID生成器

    项目地址 基于redis的分布式ID生成器. 准备 首先,要知道redis的EVAL,EVALSHA命令: 原理 利用redis的lua脚本执行功能,在每个节点上通过lua脚本生成唯一ID. 生成的I ...

  2. hystrix原理_面试必问的SpringCloud实现原理图

    引言 面试中面试官喜欢问组件的实现原理,尤其是常用技术,我们平时使用了SpringCloud还需要了解它的实现原理,这样不仅起到举一反三的作用,还能帮助轻松应对各种问题及有针对的进行扩展. 以下是&l ...

  3. 融云发送图片消息_IM消息ID技术专题(五):开源分布式ID生成器UidGenerator的技术实现...

    1.引言 很多人一想到IM应用开发,第一印象就是"长连接"."socket"."保活"."协议"这些关键词,没错,这些确 ...

  4. 雪花算法id长度_【Java】分布式自增ID算法雪花算法 (snowflake,Java版)

    作者:H__D 转载自: https://www.cnblogs.com/h--d/p/11342741.html 一般情况,实现全局唯一ID,有三种方案,分别是通过中间件方式.UUID.雪花算法. ...

  5. 简述ip地址的abc类如何划分_面试官问:讲讲IP地址的分配原理

    网络模型介绍 在计算机网络中有著名的OSI七层协议体系结构,概念清楚,理论完整,但是它既复杂又不实用.TCP/IP体系结构则不同,得到了广泛的应用.最终结合OSI和TCP/IP的优点,采用了一种只有五 ...

  6. synchronized原理_面试必备—Synchronized 关键字使用、底层原理

    在并发编程中存在线程安全问题,主要原因有: 1.存在共享数据 2.多线程共同操作共享数据 关键字synchronized可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块,同时synchro ...

  7. 生成唯一字符串算法_面试官问:在分布式场景,生成唯一ID,你有几种方案?...

    来源:http://t.cn/RG0AW0a 说明:本文代码采用C#,重要的是理解解决方案,代码实现都是次要的. 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成I ...

  8. java执行sql文件_面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他

    初识 MyBatis MyBatis 是第一个支持自定义 SQL.存储过程和高级映射的类持久框架.MyBatis 消除了大部分 JDBC 的样板代码.手动设置参数以及检索结果.MyBatis 能够支持 ...

  9. .jar中没有主清单属性_面试官问:为什么SpringBoot的 jar 可以直接运行?

    点击上方蓝色字体,选择"设为星标" 优质文章,及时送达 来源 | https://urlify.cn/uQvIna SpringBoot提供了一个插件spring-boot-mav ...

最新文章

  1. 那些巨头公司的前端面试都喜欢问些什么?
  2. VS2010项目生成时提示错误“在证书存储区中找不到清单签名证书”?
  3. sybase 数据库恢复
  4. java jsoup解析html标签_jsoup解析html
  5. eclipse juno_Eclipse Juno上带有GlassFish的JavaEE 7
  6. 什么叫冷备用状态_新密5P加工中心冷油机生产厂家电话【瀚信德】
  7. java 调试_我最喜欢的Java调试技术
  8. Qt学习: QFileDialog和QMessageBox的用法和程序示例
  9. Python使用系统聚类方法进行数据分类案例一则
  10. Luogu1886 滑动窗口 /【模板】单调队列
  11. shine 插件_《SHINE》正式上线|GBZ将你带入重重的紫色迷雾中
  12. .mat转.tif 用于arcgis裁剪遥感图像
  13. iphone11屏比例_iPhone每一代的屏幕尺寸比例是多少
  14. Rasa中文聊天机器人开发指南(2):NLU篇
  15. 青云QingCloud:重剑无锋 大巧不工
  16. 判断方阵是否沿主对角线对称
  17. 用JAVA编写MD5大写32位加密
  18. Linux 追踪技术 ftrace 简介(一)
  19. UE4 靠近物体时显示文字,远离时文字消失
  20. x-studio(Lua调试器,粒子编辑器,UI编辑器,代码编辑器,csb恢复工具)

热门文章

  1. Java锁之公平和非公平锁
  2. Java多线程之多线程之间按顺序调用
  3. Tencent JDK 国产化CPU架构支持分享
  4. 大牛书单 | 大数据存储方向好书分享
  5. 报名 | 腾讯组织的区块链技术沙龙,本周六在深圳!
  6. 视频直播中用户连麦技术模型与特点分析
  7. linux 下查看机器是cpu是几核的
  8. HDFS无法对大量小文件进行存储
  9. 小师妹学JavaIO之:try with和它的底层原理
  10. excel两个表格数据对比_Office 2010如何在桌面显示两个独立Excel表格