【无标题】

雪花算法

雪花算法(Snowflake Algorithm)是一种生成唯一ID的方法,由Twitter开发,用于解决分布式系统中生成唯一序列号的问题。以下是雪花算法的主要特点和组成部分:

雪花算法的原理

  雪花算法的原理就是生成一个的 64 位比特位的 long 类型的唯一 id。

        1.最高 1 位固定值 0,因为生成的 id 是正整数,如果是 1 就是负数了。
        2.接下来 41 位存储毫秒级时间戳,2^41/(1000*60*60*24*365)=69,大概可以使用 69 年。
        3.再接下 10 位存储机器码,包括 5 位 datacenterId 和 5 位 workerId。最多可以部署 2^10=1024 台机器。
        4.最后 12 位存储序列号。同一毫秒时间戳时,通过这个递增的序列号来区分。即对于同一台机器而言,同一毫秒时间戳下,可以生成 2^12=4096 个不重复 id。

可以将雪花算法作为一个单独的服务进行部署,然后需要全局唯一 id 的系统,请求雪花算法服务获取 id 即可。

对于每一个雪花算法服务,需要先指定 10 位的机器码,这个根据自身业务进行设定即可。例如机房号+机器号,机器号+服务号,或者是其他可区别标识的 10 位比特位的整数值都行。

 雪花算法的实现逻辑:

        1. 获取当前时间戳:以毫秒为单位的当前时间戳。

        2. 构建ID:将时间戳、数据中心ID、机器ID和序列号通过位运算组合成一个64位的整数。

        3. 序列号自增:每个新ID都会使序列号增加,如果达到最大值则回绕到0,并进入下一个时间戳。

        4. 特殊情况处理:如果当前时间戳小于上一个ID生成的时间戳,算法需要能够处理这种情况。

算法优缺点

雪花算法有以下几个优点:

        高并发分布式环境下生成不重复 id,每秒可生成百万个不重复 id。
        基于时间戳,以及同一时间戳下序列号自增,基本保证 id 有序递增。
        不依赖第三方库或者中间件。
        算法简单,在内存中进行,效率高。

雪花算法有如下缺点:

        依赖服务器时间,服务器时钟回拨时可能会生成重复 id。算法中可通过记录最后一个生成 id 时的时间戳来解决,每次生成 id 之前比较当前服务器时钟是否被回拨,避免生成重复 id。

class SnowflakeIdWorker {
    long lastTimestamp = -1L; // 上次生成ID的时间戳
    long sequence = 0L; // 序列号

    synchronized long nextId() {
        long currentTimestamp = currentTimeMillis();
        if (currentTimestamp < lastTimestamp) {
            // 处理时间回拨
        }
        if (currentTimestamp == lastTimestamp) {
            sequence = (sequence + 1) & maxSequence;
            if (sequence == 0) {
                // 等待到下一个毫秒
            }
        } else {
            sequence = 0;
        }
        lastTimestamp = currentTimestamp;

        // 构建ID
        long id = ((currentTimestamp - epoch) << timestampShift) |
                  (datacenterId << datacenterShift) |
                  (machineId << machineShift) |
                  sequence;
        return id;
    }
}

建造者模式

        定义:封装一个复杂对象构造过程,并允许按步骤构造。

        

角色组成

        产品类(Product):表示被创建的复杂对象。它通常包含多个部分或者组成,并由具体的建造者逐步构建而成。

        抽象建造者类(Builder):定义了建造复杂对象所需要的各个部分的创建方法。它通常包括多个构建方法和一个返回产品的方法。

        具体建造者类(ConcreteBuilder):实现Builder接口,并提供各个部分或者组成的构建方法。

        指挥者类(Director):负责控制建造者的构建顺序,指挥建造者如何构建复杂对象。

建造者模式作用

        用于对复杂对象的创建的一种设计模式

优缺点:

建造者模式优点 :

  • 封装性好 : 创建和使用分离 ;
  • 扩展性好 : 建造类之间相互独立 , 在一定程度上解耦 ;

建造者模式缺点 :

  • 增加类数量 : 产生多余的Builder 对象 ;
  • 内部修改困难 : 如果产品内部发生变化 , 建造者也要相应修改 ;
  • 创建对象:对象结构过于复杂执行,效率低;结构过于简单,不如工厂模式

和工厂模式区别

        建造者模式更适用于构建复杂对象,而工厂模式更适用于创建一系列相关对象。

        关注维度不同:工厂模式构建对象,建造者模式关注产品的构建过程。

建造者模式应用

 生活场景
        1.盒饭套餐:顾客可以选择不同的菜,服务员按照顾客的要求,将这些菜组合起来,最终构建出一个完整的套餐。
        2.盖房子:需要分多个阶段进行

  • 15
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值