常见的几种ID生成方式对比:
种类 |
全局唯一 |
高性能 |
高可用 |
趋势递增 |
中心服务 |
缺点 |
UUID |
是 |
高(本地生成,(无网络开销) |
低(无序,不适用) |
否 |
否 |
无序、字符串 |
数据库自增 |
单表唯一 |
中 |
中(宕机就会使业务服务中断) |
是 |
否 |
安全性差,能猜出来规律 对于分库分表场景无法唯一 |
数据库自增-集群 |
是 |
中 |
中(宕机就会使业务服务中断) |
是 |
否 |
通过设置初始值及步长进行自增 不好扩展,增加节点可能导致不唯一 |
数据库号段模式 |
是 |
低(需要频繁更新表maxId) |
中(宕机就会使业务服务中断) |
是 |
否 |
依赖数据库,需要频繁更新数据库maxId 乐观锁方式保证高可用 |
数据库号段模式+缓存 |
是 |
中 |
中 |
是 |
否 |
在号段模式基础上增加缓存buffer 缓存数据同步到数据库需要保证强一致性,增加了复杂度 |
redis的incr |
单模块唯一 多模块不适用 |
中 |
中(宕机就会使业务服务中断) |
是 |
否 |
多服务情况下单台redis无法满足 多redis集群时,主master宕机,会在较短时间内存在ID重复 |
雪花算法 |
高(不考虑回拨情况下) |
高(本地生成,(无网络开销) |
中(趋势递增) |
是 |
否 |
存在时钟回拨问题 多节点时可能需要自定义datacenterId和machineId的生成(IP) |
百度uid generator |
高 |
高(本地生成,(无网络开销) |
高(趋势递增) |
是 |
否 |
在雪花算法基础上增加启动服务时获取workId(或初始化workId) 项目启动时间会被拉长,依赖数据库 |
美团Leaf |
高 |
高(本地生成,(无网络开销,需要自己实现) 中(中心服务) |
高(自定义方式较复杂) |
是 |
是 |
百度uid模式下衍生而来 可以实现自己的ID生成中心,即leaf-server,由该项目提供获取ID的方法供调用,但该方式比较耗IO,性能会有所下降 依赖数据库或zookeper 为了提升性能,需要自己在项目里面自定义实现Leaf server |
滴滴TynyId |
高 |
高(本地生成,(无网络开销,需要自己实现) 中(中心服务) |
高(自定义方式较复杂) |
是 |
是 |
美团Leaf模式下衍生而来 可以实现自己的ID生成中心,即TynyId-server,由该项目提供获取ID的方法供调用,但该方式比较耗IO,性能会有所下降 依赖数据库或zookeper 为了提升性能,需要自己在项目里面自定义实现TynyId server |
----------------------------------------------------------------------------------------------
一, 引入依赖:
-
mysql -
mysql-connector-java -
8.0.19 -
org.mybatis.spring.boot -
mybatis-spring-boot-starter -
2.2.2
二, 新建表
- CREATE TABLE `auto_generate` (
- `id` bigint NOT NULL AUTO_INCREMENT,
- `name` varchar(100) DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
三, resources目录下编写自动生成代码配置文件: generatorConfig.xml
- "1.0" encoding="UTF-8"?>
- PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
- "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
-
-
-
"/Users/lizhihao/.m2/repository/mysql/mysql-connector-java/8.0.19/mysql-connector-java-8.0.19.jar"/> -
-
"testTables" targetRuntime="MyBatis3"> -
-
-
"suppressAllComments" value="true"/> -
-
-
-
"com.mysql.cj.jdbc.Driver" - connectionURL="jdbc:mysql://localhost:3306/generate_id" userId="root"
- password="root">
-
-
-
-
-
"forceBigDecimals" value="false"/> -
-
-
-
"org.com.spi.model" targetProject="src/main/java"> -