暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

345

背景:

    在单库单表的模式下,利用数据库自增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()

      @Data
      @TableName("product_order")
      @EqualsAndHashCode(callSuper = false)
      public class ProductOrderDO {


      //IdType.ASSIGN_ID是指雪花算法,作用于id
      @TableId(value = "id",type = IdType.ASSIGN_ID)
      private Long id;
      private String outTradeNo;
      private String state;
      private Date createTime;
      private Double payAmount;
      private String nickname;
      private Long userId;
      }

      方式2、使⽤Sharding-Jdbc配置⽂件的方式,并删除DO类中的@TableId()配置。

      在application.properties中添加如下内容:

        #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的视频文件的地址如下:

        录制文件:

        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年算法题讲解视频》,最终以初试专业第三名进入了北理工软件工程专业。熟悉并掌握常见的数据结构,比如链表、数组、树、图、队列、堆栈等等,精通数据结构教材中的所有算法,比如常见的遍历算法、动态规划,递归,回溯,剪枝,并查集,最短路径,拓扑排序等,所以快加入训练营吧,我们一起进步

        奔跑的小梁,公众号:梁霖编程工具库我决定了,算法文档开源!!


        文章转载自梁霖编程工具库,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论