分布式 id 的四种写法,你会吗?

1,361 阅读2分钟

引言

我们在生活中,id 与我们的生活实际上是形影不离的。

身份证号,QQ 号,手机号,银行卡号,学生时代的学号,甚至是躺在你硬盘里的番号。

这些 id 标识是如此的重要,乃至每一个后台程序员都要去思考这个问题—— id 的有几种写法?都有哪些利弊?

本文就带你深入浅出学习几种常见的 id 的生成策略。

入门学习

由于篇幅优先,建议阅读下面的文章内容。

分布式 id 生成需求

uuid 策略讲解

random 生成策略

snowflake 算法讲解

开源工具

id 是一款为 java 设计常见 ID 实现策略。

让你在日常开发中可以开箱即用,享受提前下班的快乐~

创作意图

对于 id 生成,基本是所有后台系统必须面对的问题,分布式 id 的生成也是很常见的一个需求。

最近同事写的代码,在多台机器高并发下产生了序列号冲突。

觉得 id 策略应该聚合成一个工具包,而不是每次重复造轮子,有时候还有问题。

特性

  • 极简 api,一行代码搞定一切

  • 内置多种 id 生成策略,总有一款适合你

  • jar 包只有 13k

快速开始

maven 引入

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>id</artifactId>
    <version>0.0.2</version>
</dependency>

入门例子

测试代码

final String snowflake = IdHelper.snowflake();

System.out.println(snowflake);
  • 结果
1260199310461505537

内置方法

所有的 id 都可以通过 IdHelper 直接调用。

序号 方法 例子
1 uuid8() dUlmJiEq
2 uuid32() 3f9afd5773d143fb8e28d80de47f3d1a
3 random() 202005122127270743937635635
4 random(prefix, length) random("999", 5) 为 9992020051221340961522263
5 snowflake() 1260199914969849858
6 local() 从 0 开始,逐渐加 1 的 id 返回

Road-Map

  • snowflake 定制化+代码优化

  • 引入 comb 算法

  • 其他开源 id 的兼容

  • 基于常见数据库的 id 生成

  • 基于 redis 的 id 生成