公众号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
测试结果如下:
我在腾讯会议讲解组合总和2的视频文件的地址如下:
录制文件:
访问密码:4Zse
关于leetcode算法训练营:
加我微信号私聊参加训练营,尤其是想进入大厂工作的同学,算法是绕不过去的坎,我自己花了三年时间刷算法,总结思路,刷各种数据结构课程,加入我的训练营,我手把手以在线直播课的形式带你理思路,手把手带你写代码,让你真正体会算法之美~,同时遇到不明白的地方可以直接课上和我沟通,彻底解决你的代码困难证~
本人用c++刷了800道左右的算法,java语言刷了600道左右的算法题,并对这些题做了详细的个人总结。本科期间系统学习了数据结构与算法课程,同时考研过程中写完了率辉主编的《2020年数据结构高分笔记》和《数据结构1000题》,看完的视频包括《mooc浙大数据结构国家精品课程》和《王道考研408数据结构课程》,《王道2019年算法题讲解视频》,最终以初试专业第三名进入了北理工软件工程专业。熟悉并掌握常见的数据结构,比如链表、数组、树、图、队列、堆栈等等,精通数据结构教材中的所有算法,比如常见的遍历算法、动态规划,递归,回溯,剪枝,并查集,最短路径,拓扑排序等,所以快加入训练营吧,我们一起进步
奔跑的小梁,公众号:梁霖编程工具库我决定了,算法文档开源!!