日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

java算法之靜態內部類實現雪花算法

瀏覽:26日期:2022-08-12 18:56:40
目錄概述一、概念1、原理二、靜態類部類單例模式生產雪花ID代碼1、代碼2、測試結果3、為什么說41位時間戳最長只能有69年概述

在生成表主鍵ID時,我們可以考慮主鍵自增 或者 UUID,但它們都有很明顯的缺點

主鍵自增:1、自增ID容易被爬蟲遍歷數據。2、分表分庫會有ID沖突。

UUID: 1、太長,并且有索引碎片,索引多占用空間的問題 2、無序。

雪花算法就很適合在分布式場景下生成唯一ID,它既可以保證唯一又可以排序。為了提高生產雪花ID的效率,

在這里面數據的運算都采用的是位運算

一、概念1、原理

SnowFlake算法生成ID的結果是一個64bit大小的整數,它的結構如下圖:

java算法之靜態內部類實現雪花算法

算法描述:

1bit 因為二進制中最高位是符號位,1表示負數,0表示正數。生成的ID都是正整數,所以最高位固定為0。

41bit-時間戳 精確到毫秒級,41位的長度可以使用69年。時間位還有一個很重要的作用是可以根據時間進行排序。

10bit-工作機器id 10位的機器標識,10位的長度最多支持部署1024個節點。

12bit-序列號 序列號即一系列的自增id,可以支持同一節點同一毫秒生成多個ID序號。12位(bit)可以表示的最大正整數是java算法之靜態內部類實現雪花算法,即可以用0、1、2、3、....4094這4095個數字,來表示同一機器同一時間截(毫秒)內產生的4095個ID序號。

說明 由于在Java中64bit的整數是long類型,所以在Java中SnowFlake算法生成的id就是long來存儲的。

二、靜態類部類單例模式生產雪花ID代碼

下面生成雪花ID的代碼可以用于線上分布式項目中來生成分布式主鍵ID,因為設計采用的靜態內部類的單例模式,通過加synchronized鎖來保證在

同一個服務器線程安全。至于不同服務器其實是不相關的,因為它們的機器碼是不一致的,所以就算同一時刻兩臺服務器都產生了雪花ID,那也不會一樣的。

1、代碼

public class SnowIdUtils { /** * 私有的 靜態內部類 */ private static class SnowFlake {/** * 內部類對象(單例模式) */private static final SnowIdUtils.SnowFlake SNOW_FLAKE = new SnowIdUtils.SnowFlake();/** * 起始的時間戳 */private final long START_TIMESTAMP = 1557489395327L;/** * 序列號占用位數 */private final long SEQUENCE_BIT = 12;/** * 機器標識占用位數 */private final long MACHINE_BIT = 10;/** * 時間戳位移位數 */private final long TIMESTAMP_LEFT = SEQUENCE_BIT + MACHINE_BIT;/** * 最大序列號 (4095) */private final long MAX_SEQUENCE = ~(-1L << SEQUENCE_BIT);/** * 最大機器編號 (1023) */private final long MAX_MACHINE_ID = ~(-1L << MACHINE_BIT);/** * 生成id機器標識部分 */private long machineIdPart;/** * 序列號 */private long sequence = 0L;/** * 上一次時間戳 */private long lastStamp = -1L;/** * 構造函數初始化機器編碼 */private SnowFlake() { //模擬這里獲得本機機器編碼 long localIp = 4321; //localIp & MAX_MACHINE_ID最大不會超過1023,在左位移12位 machineIdPart = (localIp & MAX_MACHINE_ID) << SEQUENCE_BIT;}/** * 獲取雪花ID */public synchronized long nextId() { long currentStamp = timeGen(); //避免機器時鐘回撥 while (currentStamp < lastStamp) {// //服務器時鐘被調整了,ID生成器停止服務.throw new RuntimeException(String.format('時鐘已經回撥. Refusing to generate id for %d milliseconds', lastStamp - currentStamp)); } if (currentStamp == lastStamp) {// 每次+1sequence = (sequence + 1) & MAX_SEQUENCE;// 毫秒內序列溢出if (sequence == 0) { // 阻塞到下一個毫秒,獲得新的時間戳 currentStamp = getNextMill();} } else {//不同毫秒內,序列號置0sequence = 0L; } lastStamp = currentStamp; //時間戳部分+機器標識部分+序列號部分 return (currentStamp - START_TIMESTAMP) << TIMESTAMP_LEFT | machineIdPart | sequence;}/** * 阻塞到下一個毫秒,直到獲得新的時間戳 */private long getNextMill() { long mill = timeGen(); // while (mill <= lastStamp) {mill = timeGen(); } return mill;}/** * 返回以毫秒為單位的當前時間 */protected long timeGen() { return System.currentTimeMillis();} } /** * 獲取long類型雪花ID */ public static long uniqueLong() {return SnowIdUtils.SnowFlake.SNOW_FLAKE.nextId(); } /** * 獲取String類型雪花ID */ public static String uniqueLongHex() {return String.format('%016x', uniqueLong()); } /** * 測試 */ public static void main(String[] args) throws InterruptedException {//計時開始時間long start = System.currentTimeMillis();//讓100個線程同時進行final CountDownLatch latch = new CountDownLatch(100);//判斷生成的20萬條記錄是否有重復記錄final Map<Long, Integer> map = new ConcurrentHashMap();for (int i = 0; i < 100; i++) { //創建100個線程 new Thread(() -> {for (int s = 0; s < 2000; s++) { long snowID = SnowIdUtils.uniqueLong(); log.info('生成雪花ID={}',snowID); Integer put = map.put(snowID, 1); if (put != null) {throw new RuntimeException('主鍵重復'); }}latch.countDown(); }).start();}//讓上面100個線程執行結束后,在走下面輸出信息latch.await();log.info('生成20萬條雪花ID總用時={}', System.currentTimeMillis() - start); }}2、測試結果

java算法之靜態內部類實現雪花算法

從圖中我們可以得出

1、在100個線程并發下,生成20萬條雪花ID的時間大概在1.6秒左右,所有所性能還是蠻ok的。

2、生成20萬條雪花ID并沒有一條相同的ID,因為有一條就會拋出異常了。

3、為什么說41位時間戳最長只能有69年

我們思考41的二進制,最大值也就41位都是1,也就是也就是說41位可以表示java算法之靜態內部類實現雪花算法

所以說雪花算法生成的ID,只能保證69年內不會重復,如果超過69年的話,那就考慮換個服務器部署吧,并且要保證該服務器的ID和之前都沒有重復過。

以上就是java算法之靜態內部類實現雪花算法的詳細內容,更多關于java算法的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本在线不卡视频| 日本在线成人| 91综合视频| 日韩中文影院| 五月精品视频| 偷拍亚洲精品| 久久免费视频66| 欧美日韩尤物久久| av资源亚洲| 亚洲国产一区二区在线观看| 水野朝阳av一区二区三区| 在线一区二区三区视频| 亚洲精品美女| 精品视频在线你懂得| 激情欧美日韩一区| 亚洲一级大片| 久久91视频| 欧美日韩第一| 久久国产精品色av免费看| 日韩在线短视频| 亚洲精品影视| 精品国产欧美| 久久亚洲国产精品一区二区| 日本久久一区| 不卡福利视频| 视频一区日韩精品| 免费观看亚洲| 97成人超碰| 久久亚洲国产| 国产精品一站二站| 一级欧洲+日本+国产| 久久99青青| 在线亚洲国产精品网站| 麻豆精品新av中文字幕| 欧美在线资源| 久久一区国产| 久久最新视频| а√天堂中文在线资源8| 一区免费在线| 精品视频免费| 少妇精品久久久一区二区三区| 精品日本视频| 综合激情婷婷| 99久久久久| 欧美精品不卡| 一区二区三区网站| 成人久久久久| 国产极品模特精品一二| 99热免费精品| 激情国产在线| 国产精品调教| 亚洲精品三级| 成人av动漫在线观看| 欧美激情在线精品一区二区三区| 一级欧洲+日本+国产| 精品久久一区| 91久久精品无嫩草影院| 91精品国产成人观看| 国产精品久久久网站| 在线精品一区| 国产专区一区| 日韩三区免费| 国产一区二区三区精品在线观看| 四虎精品一区二区免费| 亚洲成人日韩| 99精品网站| 日本黄色精品| 国产精品超碰| 亚洲精品成人一区| 日韩午夜高潮| 极品日韩av| 91精品蜜臀一区二区三区在线| 久久一区精品| 国产日产一区| 欧美精品福利| 日韩高清一级| 日韩精品一区二区三区av| 蜜桃久久久久久久| 国产午夜久久| 99成人在线| 夜夜精品视频| 99riav1国产精品视频| 蜜桃tv一区二区三区| 国产综合色区在线观看| 综合日韩av| 成人啊v在线| 日韩大片在线播放| 在线观看精品| 91精品啪在线观看国产18| 日本高清不卡一区二区三区视频| 国产成人久久精品一区二区三区| 国产一区二区三区四区二区| 精品一区视频| 成人黄色av| 日韩欧美另类一区二区| 欧美日韩视频免费观看| 久久影视一区| 亚洲主播在线| 免费在线看一区| 亚洲精品第一| 国产精品日本一区二区不卡视频| 国产精品日韩精品中文字幕| 欧美成人aaa| 欧美香蕉视频| 99pao成人国产永久免费视频 | 欧洲一区二区三区精品| 中文字幕人成乱码在线观看| 久久男女视频| 亚洲二区在线| 久久99伊人| 国产亚洲一卡2卡3卡4卡新区| 麻豆91在线播放| 日韩在线视频精品| 伊人久久亚洲热| 人人爱人人干婷婷丁香亚洲| 精品午夜久久| 午夜国产一区二区| 综合一区二区三区| 国产免费播放一区二区| 国产不卡一区| 黄色日韩精品| 国产视频网站一区二区三区| аⅴ资源天堂资源库在线| 99成人在线视频| 日韩专区一卡二卡| 国产精品久久亚洲不卡| 欧美三级精品| 亚洲一区导航| 精品国产欧美日韩| 狠狠色狠狠色综合日日tαg| 日韩av网站在线观看| 日韩在线不卡| 日本成人中文字幕在线视频| 另类中文字幕国产精品| 天堂精品久久久久| 中文字幕高清在线播放| 免费久久精品视频| 国产96在线亚洲| 亚洲综合电影一区二区三区| 国产精品免费精品自在线观看| 91精品蜜臀一区二区三区在线| 偷拍亚洲精品| 欧美影院三区| 国产精品免费99久久久| 亚洲精品2区| 麻豆一区在线| 蜜桃av一区二区三区电影| 国产一区国产二区国产三区 | 午夜一区在线| 成人国产精选| 亚洲精品乱码| 天堂日韩电影| 日韩高清国产一区在线| 美女毛片一区二区三区四区| 欧美91在线| 亚洲一区av| 免费av一区二区三区四区| 欧美激情在线精品一区二区三区| 亚洲在线网站| 日韩精品首页| 久久一区视频| 97久久超碰| 性色av一区二区怡红| 青青青免费在线视频| 欧美日韩一视频区二区| 国产亚洲综合精品| 日韩在线视频精品| 国产日韩欧美三级| 亚洲一区二区三区久久久| 欧美中文字幕一区二区| 粉嫩av一区二区三区四区五区 | 免费久久99精品国产自在现线| 日韩av有码| 国产精品夜夜夜| 日韩精品欧美大片| 丝袜美腿高跟呻吟高潮一区| 亲子伦视频一区二区三区| 精品亚洲免a| 国产精品www.| 伊人久久一区| 偷拍欧美精品| 久久久精品五月天| 日韩成人免费| 成人精品动漫一区二区三区| 国产精品久久久久久久久久白浆| 在线精品福利| 免费日韩av片| 性欧美精品高清| 亚洲一卡久久| 蜜臀av免费一区二区三区| 四虎4545www国产精品| 91日韩免费| 中文字幕人成乱码在线观看| 国产精品精品国产一区二区| 久久精品国产亚洲aⅴ| 久久国产免费看| 国产精品亲子伦av一区二区三区| 91嫩草精品| 国产情侣一区| 国产精品麻豆成人av电影艾秋|