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
  7. 支持多个db的配置,无单点

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

依赖

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

示例

请参考getting start

推荐使用方式

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

tinyid的原理

  • tinyid是基于数据库发号算法实现的,简单来说是数据库中保存了可用的id号段,tinyid会将可用号段加载到内存中,之后生成id会直接内存中产生(如可用号段1~1000被加载到内存,则获取id时,会从1开始递增获取)。
  • 可用号段在第一次获取id时加载,如前号段已使用达到一定量时,会异步加载下一可用号段,保证内存中始终有可用的号段(如当前号段是1(削除) 1000,当使用到200时,则会加载下一可用号段到内存,可能是1001 (削除ここまで)2000)。

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的核心流程。nextId最终通过AtomicLong.andAndGet(delta)方法产生。

其他说明

  • 关于tinyid,并不是官方滴滴产品(实验或其他),它恰好是Didi所拥有的代码。
  • 关于id生成,在谷歌/百度上搜索关键字"id生成"可以看到很多方案,大概分为db发号、twitter snowflake、redis、mogodb的ObjectId等等,以下是一些参考资料:

Clone this wiki locally

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