分布式ID生成解决方案

分布式ID生成解决方案

为什么要生成分布式ID?

答:如果一张表的数据过多,会影响性能,那么就会进行分表。但是分表会导致ID重复,那么以前的id就不能使用了,所以我们需要使用分布式生成ID

UUID

常见的方式。可以利用数据库也可以利用程序生成,一般来说全球唯一。

优点:

  • 简单,代码方便

  • 生成ID性能非常好,基本不会有性能问题

  • 全球唯一,在遇见数据迁移,系统数据合并,或者数据库变更等情况下,可以从容应对

缺点:

  • 没有排序,无法保证趋势递增
  • UUID往往是使用字符串存储,查询的效率比较低
  • 存储空间较大,如果是海量数据库,就需要考虑存储量的问题
  • 传输数据量大
  • 不可读

Redis

当使用数据库来生成ID性能不够要求的时候,我们可以尝试使用Redis来生成ID。这主要依赖于Redis是单线程的,所以也可以用生成全局唯一的ID。可以用Redis的原子操作INCR和INCRBY来实现

优点:

  • 不依赖于数据库,灵活方便,且性能优于数据库

  • 数字ID天然排序,对分页或者需要排序的结果很有帮助

缺点:

  • 如果系统中没有Redis,还需要引入新的组件,增加系统复杂度
  • 需要编码和配置的工作量比较大
  • 网络传输造成性能下降

推荐开源算法snowflake(雪花算法)

snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。核心思想是:使用41bit作为毫秒数时间戳,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生4096个ID),最后还有一个符号位,永远是0

在这里插入图片描述

snowflake(雪花算法)案例

步骤:

  1. 导入IdWorker工具类

  2. 在yml文件配置数据中心和机器ID

    workId: 0
    datacenterId: 0
    
  3. 在启动类把IdWorker载入Spring容器

        @Value("${workId}")
        private int workId;
    
        @Value("${datacenterId}")
        private int datacenterId;
    
        @Bean
        public IdWorker idWorker(){
            return new IdWorker(workId,datacenterId);
        }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值