行业知识
分布式ID选型对比(1)
常见���几种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
上一篇:鸡膜怎么这么贵?
下一篇:软路由服务器怎么设置方法?