分库分表下的id唯一解决方案和实战案例

简介: 分库分表下的id唯一解决方案和实战案例

公众号merlinsea


背景:

   在单库单表的模式下,利用数据库自增id可以保障每条记录的id具有唯一性,但是如果是分库分表以后,自增id无法保障某条记录的id在所有的分表中是唯一的。

业界常见解决方案:


  • 数据库⾃增ID
  • 利⽤⾃增id, 设置不同的⾃增步长,auto_increment_offset、auto-increment-increment
  • 比如DB1从1开始自增,每次自增2;DB2从2开始自增,每次自增2
  • 缺点:1、依靠数据库系统的功能实现,但是未来扩容麻烦 2、主从切换时的不⼀致可能会导致重复发号 3、性能瓶颈存在单台sql上。
  • UUID
  • 性能⾮常⾼,没有⽹络消耗
  • 缺点:⽆序的字符串,不具备趋势⾃增特性; UUID太长,不易于存储,浪费存储空间,很多场景不适⽤。
  • Redis发号器
  • 利⽤Redis的INCR和INCRBY来实现,原⼦操作,线程安全,性能⽐Mysql强劲
  • 缺点:需要占⽤⽹络资源,增加系统复杂度
  • 雪花算法
  • twitter 开源的分布式 ID ⽣成算法,代码实现简单、不占⽤宽带、数据迁移不受影响
  • ⽣成的 id 中包含有时间戳,所以⽣成的 id 按照时间递增
  • 如果是分布式部署了多台服务器,需要保证每台服务器系统时间⼀样,机器编号不⼀样
  • 缺点:依赖系统时钟(多台服务器时间⼀定要⼀样)


springboot整合sharding-jdbc的雪花算法保证id唯一性的实战


1、在application.properties中指定workId

注意:不同的机器分布不一样的机器id就可以,这里因为所有的库表都在一台机器上,索引workId是相同的



#配置workId
spring.shardingsphere.sharding.tables.product_order.key-generator.props.worker.id=1


2、指定id生成算法是雪花算法,并作用于表的id字段

下面l两种方式,只需要选择其中一种就行。

方式1、在mybatis plus的DO类中指定主键id的属性@TableId()


#id生成策略
#雪花算法生产的序列号作用于product_order逻辑表的id字段
spring.shardingsphere.sharding.tables.product_order.key-generator.column=id
#采用的方式是雪花算法
spring.shardingsphere.sharding.tables.product_order.key-generator.type=SNOWFLAKE


测试结果如下:

640.jpg


我在腾讯会议讲解组合总和2的视频文件的地址如下:

录制文件:

https://meeting.tencent.com/v2/cloud-record/share?id=1988a7af-d26f-4169-a401-539a95bdaec0&from=3&is-single=true

访问密码:4Zse


关于leetcode算法训练营:

 

加我微信号私聊参加训练营,尤其是想进入大厂工作的同学,算法是绕不过去的坎,我自己花了三年时间刷算法,总结思路,刷各种数据结构课程,加入我的训练营,我手把手以在线直播课的形式带你理思路,手把手带你写代码,让你真正体会算法之美~,同时遇到不明白的地方可以直接课上和我沟通,彻底解决你的代码困难证~

本人用c++刷了800道左右的算法,java语言刷了600道左右的算法题,并对这些题做了详细的个人总结。本科期间系统学习了数据结构与算法课程,同时考研过程中写完了率辉主编的《2020年数据结构高分笔记》和《数据结构1000题》,看完的视频包括《mooc浙大数据结构国家精品课程》和《王道考研408数据结构课程》,《王道2019年算法题讲解视频》,最终以初试专业第三名进入了北理工软件工程专业。熟悉并掌握常见的数据结构,比如链表、数组、树、图、队列、堆栈等等,精通数据结构教材中的所有算法,比如常见的遍历算法、动态规划,递归,回溯,剪枝,并查集,最短路径,拓扑排序等,所以快加入训练营吧,我们一起进步

奔跑的小梁,公众号:梁霖编程工具库我决定了,算法文档开源!!
相关文章
|
存储 缓存 算法
[转]分布式唯一ID生成方案
分布式唯一ID生成方案
230 0
[转]分布式唯一ID生成方案
|
算法 NoSQL 关系型数据库
九种分布式ID解决方案
在复杂的分布式系统中,往往需要对大量的数据进行唯一标识,比如在对一个订单表进行了分库分表操作,这时候数据库的自增ID显然不能作为某个订单的唯一标识。除此之外还有其他分布式场景对分布式ID的一些要求:
833 0
|
7月前
|
设计模式 算法 Java
面试官:分库分表后如何生成全局ID?
面试官:分库分表后如何生成全局ID?
167 1
|
7月前
|
存储 算法 NoSQL
全网最全的分布式ID生成方案解析
全网最全的分布式ID生成方案解析
485 0
|
存储 NoSQL 算法
分布式唯一 ID 的 7 种生成方案
在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID、退款ID等。那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们应该采用哪种适合自己的解决方案是十分重要的。下面我们一一来列举一下,不一定全部适合,这些解决方案仅供你参考,或许对你有用。
分布式唯一 ID 的 7 种生成方案
|
7月前
|
存储 算法 关系型数据库
分库分表常见问题和解决方案
分库分表常见问题和解决方案
178 0
分库分表常见问题和解决方案
|
算法 NoSQL 关系型数据库
分布式id解决方案
在我们业务系统数据量不大的时候,单库单表完全可以支撑现有业务,数据再大一点搞个MySQL主从同步读写分离也能对付,这时候我们使用数据库自增id就足够了。但随着业务数据日渐增长,主从同步也扛不住了,就需要对数据库进行分库分表,但分库分表后需要有一个唯一ID来标识一条数据,数据库的自增ID显然不能满足需求;还有就是某些场景需要唯一编号标识,比如订单号,用户编号等都需要有`唯一ID`做标识。此时一个能够生成`全局唯一ID`的系统是非常必要的。那么这个`全局唯一ID`就叫`分布式ID`。
261 0
分布式id解决方案
|
存储 缓存 算法
分布式id居然还能这么搞
分布式id居然还能这么搞
87 0
9种 分布式ID生成方案,让你一次学个够
一、为什么要用分布式ID? 在说分布式ID的具体实现之前,我们来简单分析一下为什么用分布式ID?分布式ID应该满足哪些特征?
|
存储 算法 NoSQL
分布式 ID 生成方案总结整理
分布式 ID 生成方案总结整理