Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Apr 15, 2026. It is now read-only.
duimba edited this page Oct 11, 2018 · 27 revisions

简介

Tinyid是用Java开发的一款id生成器,基于数据库发号算法实现,提供http接口和java client接入方式,适用于大部分内部系统使用,具有设计简单,接入方便、稳定性高的特点。

Tinyid的特性

  1. 全局唯一的long型id
  2. 趋势递增的id,即不保证下一个id一定比上一个大
  3. 非连续性
  4. 提供http和java client方式接入
  5. 支持批量获取id
  6. 支持生成1,3,5,7,9...序列的id

tinyid适用于大部分内部系统,不太适用于做类似订单id的业务(因为生成的id大部分是连续的,容易被扫库、或者测算出订单量)

依赖

JDK1.7+,maven,mysql, java client目前仅依赖jdk

示例

请参考getting start

推荐使用方式

  • tinyid-server推荐部署到多个机房的多台机器
  • 推荐使用tinyid-client来获取id,性能和可用性更高
  • 推荐db配置两个或更多,做到无单点

tinyid的原理

  • tinyid是基于数据库发号算法实现的,简单来说是数据库中保存了可用的id号段,tinyid会将可用号段加载到内存中,之后生成id会直接内存中产生。
  • 可用号段在第一次获取id时加载,之后当 当前号段已使用达到一定量时,会异步加载下一可用号段,保证内存中始终有可用的号段。

tinyid系统架构图

tinyid 系统架构图 下面是一些关于这个架构图的说明:

  • nextId和getNextSegmentId是tinyid-server对外提供的两个http接口
  • nextId是获取下一个id,当调用nextId时,会传入bizType,每个bizType的id数据是隔离的,生成id会使用该bizType类型生成的IdGenerator。
  • getNextSegmentId是获取下一个可用号段,tinyid-client会通过此接口来获取可用号段
  • IdGenerator是id生成的接口
  • IdGeneratorFactory是生产具体IdGenerator的工厂,每个biz_type生成一个IdGenerator实例。通过工厂,我们可以随时在db中新增biz_type,而不用重启服务
  • IdGeneratorFactory实际上有两个子类IdGeneratorFactoryServer和IdGeneratorFactoryClient,区别在于,getNextSegmentId的不同,一个是DbGet,一个是HttpGet
  • CachedIdGenerator则是具体的id生成器对象,持有currentSegmentId和nextSegmentId对象,负责nextId的核心流程

其他说明

  • 关于tinyid,并不是官方滴滴产品(实验或其他),它恰好是Didi所拥有的代码。
  • 关于id生成,在谷歌/百度上搜索关键字"id生成"可以看到很多方案,大概分为db发号、twitter snowflake、redis、mogodb的ObjectId等等,以下是一些参考资料:
    • 美团leaf: 该篇文章详细的介绍了db发号和snowflake方案,tinyid也参考了leaf的部分思想,不过增加了多db的支持、java client的支持。如果你考虑db发号算法,可以试试使用tinyid
    • twitter snowflake
    • 百度uid-generator: 这是基于snowflake方案实现的开源组件

Clone this wiki locally

AltStyle によって変換されたページ (->オリジナル) /