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

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

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

瀏覽:29日期: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精品国产乱码久久久久久久 | 欧美日韩四区| 欧美成人国产| 红桃视频国产一区| 中文在线不卡| 丝袜亚洲另类欧美| 中文字幕一区日韩精品| 国产在线不卡| 最新日韩av| 视频一区视频二区中文| 中文字幕日韩高清在线| 日韩一区二区三免费高清在线观看| 蜜桃视频第一区免费观看| 婷婷综合亚洲| 噜噜噜久久亚洲精品国产品小说| 丝袜美腿亚洲色图| 国产日韩一区二区三免费高清 | 麻豆高清免费国产一区| 高清久久一区| 久久久夜夜夜| 精品一区亚洲| 综合欧美精品| 欧美精品91| 欧洲av一区二区| 在线精品视频在线观看高清| 日韩一区精品字幕| 日本午夜精品一区二区三区电影| 欧美日本二区| yellow在线观看网址| 亚洲高清激情| 日本综合视频| 日韩av有码| 黄页网站一区| 国产区精品区| 麻豆精品蜜桃| 视频一区在线视频| 国产精品久久久亚洲一区| 91视频久久| 99国产精品视频免费观看一公开 | 99成人在线视频| 在线一区二区三区视频| 欧美黄色精品| 99国产精品久久久久久久成人热 | 成人午夜网址| 国产午夜精品一区二区三区欧美 | 99视频一区| 国产九九精品| 999国产精品999久久久久久| 喷白浆一区二区| 老司机精品视频网| 欧美日韩黑人| 国产日韩视频在线| 日韩欧美二区| 亚洲乱码一区| 成人欧美一区二区三区的电影| 免费观看在线色综合| 里番精品3d一二三区| 伊人精品在线| 久久精品国产免费| 久久成人国产| 国产精品毛片久久| 亚洲精品三级| 日韩精品不卡一区二区| 亚洲日本在线观看视频| 欧产日产国产精品视频| 日韩精品亚洲专区在线观看| 久久亚洲在线| 国产亚洲欧美日韩在线观看一区二区| 99精品综合| 国产精品成人自拍| 亚洲一区二区网站| 成人亚洲一区二区| 欧美日一区二区在线观看| 欧美在线亚洲综合一区| 麻豆91小视频| 91亚洲精品在看在线观看高清| 在线日韩av| 国产在视频一区二区三区吞精| 亚洲精品护士| 99tv成人| 国产一区二区精品久| 婷婷综合福利| 蜜臀久久99精品久久一区二区| 久久成人高清| 婷婷综合一区| 石原莉奈一区二区三区在线观看 | 久久精品国产亚洲夜色av网站| 久久不卡国产精品一区二区| 亚洲精品在线a| 99pao成人国产永久免费视频| 欧美一级鲁丝片| 麻豆精品久久| 日本成人一区二区| 国产色综合网| 日本欧美不卡| 久久精品国产在热久久| 日韩欧美三区| 免费黄网站欧美| 夜夜嗨av一区二区三区网站四季av| 日韩国产一区二区三区| 精品国内亚洲2022精品成人| 日韩精品91亚洲二区在线观看| 久久性天堂网| 伊人久久婷婷| 亚洲激情五月| 国产国产精品| 久久久久国产精品一区二区| 91一区二区| 加勒比视频一区| 久久精品国产福利| 国产一区三区在线播放| 久久激情综合网| 日本久久一区| 91九色综合| 欧美一级一区| 国产探花在线精品| 国产探花一区| 国产精品白丝久久av网站| 欧美日本精品| 国产精品久久久久久久久久妞妞| 国产日韩一区二区三区在线播放| 欧美日韩一区二区三区不卡视频 | 欧美a级一区二区| 国产日韩中文在线中文字幕 | 成人在线视频免费| 久久中文字幕一区二区三区| 欧美精品不卡| 美女久久99| av免费不卡国产观看| 日韩精品诱惑一区?区三区| 日韩欧美不卡| 99成人超碰| 在线亚洲成人| 蜜臀91精品一区二区三区| 综合欧美精品| 国产精品夜夜夜| 欧美激情福利| 欧美黄色网页| 欧美午夜不卡影院在线观看完整版免费| 黄色免费成人| 日韩欧美激情电影| 国产精品一区二区av日韩在线| 美女视频黄免费的久久| 国产91在线精品| 亚洲二区免费| 一本一道久久a久久| 国产欧美日韩视频在线| 国产在视频一区二区三区吞精| 国产 日韩 欧美一区| 黄色亚洲大片免费在线观看| 亚州精品视频| 欧美日韩va| 加勒比视频一区| 狠狠操综合网| 日韩高清不卡在线| 国产精品日本一区二区三区在线 | 国产伦精品一区二区三区视频| 久久在线91| 久久中文视频| 亚洲人妖在线| 国产91在线播放精品| 国产精品97| 国产日韩一区| 亚洲国产成人二区| 亚洲激情黄色| 国产精品密蕾丝视频下载| 91嫩草亚洲精品| 中文国产一区| 欧美精品成人| 午夜国产精品视频| 911亚洲精品| 色在线视频观看| 丝袜诱惑制服诱惑色一区在线观看| 国产欧美日韩精品高清二区综合区| 国产一区二区亚洲| 国产精品毛片| 久久亚洲精精品中文字幕| 亚州av乱码久久精品蜜桃| 亚洲精品在线a| 色一区二区三区| 亚洲人亚洲人色久| av中文字幕在线观看第一页| 久久高清免费观看| 蜜桃久久久久| aa亚洲婷婷| 精品视频91| 亚洲综合日韩| 97精品国产| 亚洲精品影视| 欧洲一级精品| 国产精品网站在线看| 狠狠干成人综合网| 成人午夜在线| 亚洲一二av| 99久久激情| 欧美韩一区二区| 日精品一区二区三区|