分表分库后的id分配问题
分表分库一般是你的业务并发高,或者数据量大的情况下进行业务拆分。但是分表后会带来一系列你想不到的问题,比如我们今天要讨论的分表分库后的 id 分配问题。
分表之前,你的数据表中的主键,可以设置为自动增长等。但是分表后,id 在所有分后的表中是不能重复的。举个例子,我的用户表,我一共分了 3 个表。那么 u1 中存在 id 为 1 的主键后,u2、u3 就不能使用相同的主键 id 了。因此,分表后,要达到每个表中的主键不能相同,而且效率还得得到保证。
这里我推荐几种做法,供大家参考。
1、每个表还是保持各自的自动增长,但要让它们增长的不一样。
具体做法就是,每个表配置不同的起始值。比如,u1 配置 auto_increment = 1,然后步长为 3。u2 配置起始值为 2,步长也为 3,u3 配置起始值为 3,步长也为 3。这样做了之后,主键 Id 都能够自动增长,且能够做到不重复。
2、借助 UUID、Mongo 的 ObjectId 等生成唯一主键 Id。
UUID 由于每个微服务系统生成的都不一样,因此可以考虑作为分表后的主键 Id 来使用。另外 Mongo 的 ObjectId 本身也是采用的 UUID,因此也可以用来做分表后的主键。但是,这两个的规律性都比较差。
3、借助开源的分布式 ID 生成器。
这类开源的 ID 生成器就比较多了,我前面也写过类似的文章《5 大分布式 ID 生成器优缺点简单对比》,还被不少人转载过。
比如,出名的 snowflake,它产生的 id 太长。但是效率非常的高,适合超高并发场景。
其他的如:Leaf、sharding-jdbc、uid-generator 都需要借助 DB 支持,也就是说需要另外的表来支持。
以上就是分表分库后,全局 ID 的生成策略。我这里讨论的比较简单,具体结合自己公司的业务进行调整或采用其他方案。
©著作权归作者所有:来自51CTO博客作者mob604756f06ed8的原创作品,如需转载,请注明出处,否则将追究法律责任更多相关文章
- 一键生成前后端代码,Mybatis-Plus代码生成器让我舒服了
- 玩转可迭代对象迭代器生成器
- 报表生成器FastReport .Net如何存储和加载报告
- FastReport报表生成器有关COM / ActiveX快速报告
- TensorFlow-手写数字识别(三)
- 实际测试内存在顺序IO和随机IO时的访问延时差异
- .NET报表生成器Stimulsoft Reports.Net 常问问题解答
- Java 生成随机数的 5 种方式,你知道几种?
- Python学习系列之 xrange和range的区别!