Snowflake 实现的发号器

本文介绍了一个使用Spring Boot实现的Snowflake序列号生成器,通过时间戳、子业务ID、工作ID和递增序列组合生成唯一标识。展示了如何在Java应用中创建和使用这种高可用的ID生成策略。
package com.enation.app.javashop.framework.sncreator;

import com.enation.app.javashop.framework.context.instance.AppInstance;
import org.springframework.stereotype.Service;

/**
 * Snowflake 实现的发号器
 * @version 1.0
 * @since 7.1.0
 * 2019-11-22
 */

@Service
public class SnowflakeSnCreator implements SnCreator {


    /**
     *最大递增序列
     */
    private static final long MAX_SEQ = 4000L;

    /**
     * 起始时间戳
     */
    private static final long START_TIME = 1587092627355L;

    private static long COUNT =0;

    /**
     * 获取递增序列
     * @return
     */
    private  synchronized long getSequence() {
        COUNT++;

        if (COUNT > MAX_SEQ) {
            COUNT =0;
        }

        return COUNT;
    }


    @Override
    public Long create(int subCode) {

        long workerId = AppInstance.getInstance().getWorkId();

        /**
         *当前数据:
         *十进制:1587092627355
         *二进制:
         * |      时间戳      |
         * |______41位_______|
         */
        long v = System.currentTimeMillis() - START_TIME;
        Long sequence = getSequence();

        /**
         *当前数据:
         *十进制:时间戳 + subid (subid 不能大于二进制的10个1,也就是1023)
         *二进制:
         * |      时间戳      ||      子业务id    |
         * |______41位_______| |______5位_______|
         */
        v = v << 5;
        v = v + subCode;

        /**
         *当前数据:
         *十进制:时间戳 + subid+  机器id (机器id 不能大于二进制的10个1,也就是1023)
         *二进制:
         * |      时间戳      ||      子业务id   |      机器id    |
         * |______41位_______| |______5位_______|______5位_______|
         */
        v = v << 5;
        v = v + workerId;


        /**
         *当前数据:
         *十进制:时间戳 + subid+  workid + sequence (sequence 不能大于二进制的12个1,也就是4095)
         *二进制:
         * |      时间戳      |      子业务id  |     work id    |     sequence   |
         * |______41位_______|______5位_______|______5位_______|______10 _______|
         */
        v = v << 12;

        v = v + sequence;

        return  v;
    }



    public static void main(String[] args) {
        SnowflakeSnCreator snowflakeSnCreator = new SnowflakeSnCreator();

        for (int i = 0; i < 100; i++) {
            Long sn = snowflakeSnCreator.create(2);
            System.out.println(sn);
        }

    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值