ID號生成 雪花算法

Twitter的分布式雪花算法 SnowFlake 每秒自增生成26個萬個可排序的ID

1、twitter的SnowFlake生成ID能夠按照時間有序生成
2捺癞、SnowFlake算法生成id的結(jié)果是一個64bit大小的整數(shù)
3夷蚊、分布式系統(tǒng)內(nèi)不會產(chǎn)生重復id(用有datacenterId和machineId來做區(qū)分)
datacenterId(分布式)(服務ID 1,2髓介,3.....) 每個服務中寫死
machineId(用于集群) 機器ID 讀取機器的環(huán)境變量MACHINEID 部署時每臺服務器ID不一樣

/**
 * Twitter的分布式自增ID雪花算法snowflake
 * @author MENG
 * @create 2018-08-23 10:21
 **/
public class SnowFlake {

    /**
     * 起始的時間戳
     */
    private final static long START_STMP = 1480166465631L;

    /**
     * 每一部分占用的位數(shù)
     */
    private final static long SEQUENCE_BIT = 12; //序列號占用的位數(shù)
    private final static long MACHINE_BIT = 5;   //機器標識占用的位數(shù)
    private final static long DATACENTER_BIT = 5;//數(shù)據(jù)中心占用的位數(shù)

    /**
     * 每一部分的最大值
     */
    private final static long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT);
    private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);
    private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);

    /**
     * 每一部分向左的位移
     */
    private final static long MACHINE_LEFT = SEQUENCE_BIT;
    private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
    private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT;

    private long datacenterId;  //數(shù)據(jù)中心
    private long machineId;     //機器標識
    private long sequence = 0L; //序列號
    private long lastStmp = -1L;//上一次時間戳

    public SnowFlake(long datacenterId, long machineId) {
        if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) {
            throw new IllegalArgumentException("datacenterId can't be greater than MAX_DATACENTER_NUM or less than 0");
        }
        if (machineId > MAX_MACHINE_NUM || machineId < 0) {
            throw new IllegalArgumentException("machineId can't be greater than MAX_MACHINE_NUM or less than 0");
        }
        this.datacenterId = datacenterId;
        this.machineId = machineId;
    }

    /**
     * 產(chǎn)生下一個ID
     *
     * @return
     */
    public synchronized long nextId() {
        long currStmp = getNewstmp();
        if (currStmp < lastStmp) {
            throw new RuntimeException("Clock moved backwards.  Refusing to generate id");
        }

        if (currStmp == lastStmp) {
            //相同毫秒內(nèi)惕鼓,序列號自增
            sequence = (sequence + 1) & MAX_SEQUENCE;
            //同一毫秒的序列數(shù)已經(jīng)達到最大
            if (sequence == 0L) {
                currStmp = getNextMill();
            }
        } else {
            //不同毫秒內(nèi),序列號置為0
            sequence = 0L;
        }

        lastStmp = currStmp;

        return (currStmp - START_STMP) << TIMESTMP_LEFT //時間戳部分
                | datacenterId << DATACENTER_LEFT       //數(shù)據(jù)中心部分
                | machineId << MACHINE_LEFT             //機器標識部分
                | sequence;                             //序列號部分
    }

    private long getNextMill() {
        long mill = getNewstmp();
        while (mill <= lastStmp) {
            mill = getNewstmp();
        }
        return mill;
    }

    private long getNewstmp() {
        return System.currentTimeMillis();
    }

    public static void main(String[] args) {
        SnowFlake snowFlake = new SnowFlake(1, 1);

        long start = System.currentTimeMillis();
        for (int i = 0; i < 1000000; i++) {
            System.out.println(snowFlake.nextId());
        }

        System.out.println(System.currentTimeMillis() - start);


    }
}
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唐础,一起剝皮案震驚了整個濱河市箱歧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌彻犁,老刑警劉巖叫胁,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異汞幢,居然都是意外死亡驼鹅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門森篷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來输钩,“玉大人,你說我怎么就攤上這事仲智÷蚰耍” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵钓辆,是天一觀的道長剪验。 經(jīng)常有香客問我,道長前联,這世上最難降的妖魔是什么功戚? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮似嗤,結(jié)果婚禮上啸臀,老公的妹妹穿的比我還像新娘。我一直安慰自己烁落,他們只是感情好乘粒,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伤塌,像睡著了一般灯萍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寸谜,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天竟稳,我揣著相機與錄音属桦,去河邊找鬼。 笑死他爸,一個胖子當著我的面吹牛聂宾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诊笤,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼系谐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了讨跟?” 一聲冷哼從身側(cè)響起纪他,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晾匠,沒想到半個月后茶袒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡凉馆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年薪寓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澜共。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡向叉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嗦董,到底是詐尸還是另有隱情母谎,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布京革,位于F島的核電站奇唤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏匹摇。R本人自食惡果不足惜冻记,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望来惧。 院中可真熱鬧,春花似錦演顾、人聲如沸供搀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽葛虐。三九已至,卻和暖如春棉钧,著一層夾襖步出監(jiān)牢的瞬間屿脐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留的诵,地道東北人万栅。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像西疤,于是被迫代替她去往敵國和親烦粒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 分布式訂單號生成策略 1.關于訂單號 訂單號用于記錄用戶在電商網(wǎng)站中的下單信息(通常有商品列表代赁、金額扰她、時間等),用...
    Meathill大魔王閱讀 7,573評論 1 44
  • 轉(zhuǎn)載:細聊分布式ID生成方法 一芭碍、需求緣起 幾乎所有的業(yè)務系統(tǒng)徒役,都有生成一個記錄標識的需求,例如: (1)消息標識...
    meng_philip123閱讀 2,575評論 0 17
  • 這篇文章總結(jié)了分布式主鍵或者唯一鍵的生成算法窖壕,文章最后有我們基于snowflow算法的思考和實踐忧勿。 分布式主鍵的生...
    彥幀閱讀 2,699評論 0 5
  • 心態(tài)是人生的頂級風水! 伴侶是婚姻的頂級風水艇拍! 所以生活中一定要有個好心態(tài)狐蜕, 婚姻中一定要有個好伴侶。
    安心陪你閱讀 285評論 0 0