电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

java算法之靜態(tài)內(nèi)部類實(shí)現(xiàn)雪花算法

瀏覽:5日期:2022-08-12 18:56:40
目錄概述一、概念1、原理二、靜態(tài)類部類單例模式生產(chǎn)雪花ID代碼1、代碼2、測(cè)試結(jié)果3、為什么說(shuō)41位時(shí)間戳最長(zhǎng)只能有69年概述

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

主鍵自增:1、自增ID容易被爬蟲(chóng)遍歷數(shù)據(jù)。2、分表分庫(kù)會(huì)有ID沖突。

UUID: 1、太長(zhǎng),并且有索引碎片,索引多占用空間的問(wèn)題 2、無(wú)序。

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

在這里面數(shù)據(jù)的運(yùn)算都采用的是位運(yùn)算

一、概念1、原理

SnowFlake算法生成ID的結(jié)果是一個(gè)64bit大小的整數(shù),它的結(jié)構(gòu)如下圖:

java算法之靜態(tài)內(nèi)部類實(shí)現(xiàn)雪花算法

算法描述:

1bit 因?yàn)槎M(jìn)制中最高位是符號(hào)位,1表示負(fù)數(shù),0表示正數(shù)。生成的ID都是正整數(shù),所以最高位固定為0。

41bit-時(shí)間戳 精確到毫秒級(jí),41位的長(zhǎng)度可以使用69年。時(shí)間位還有一個(gè)很重要的作用是可以根據(jù)時(shí)間進(jìn)行排序。

10bit-工作機(jī)器id 10位的機(jī)器標(biāo)識(shí),10位的長(zhǎng)度最多支持部署1024個(gè)節(jié)點(diǎn)。

12bit-序列號(hào) 序列號(hào)即一系列的自增id,可以支持同一節(jié)點(diǎn)同一毫秒生成多個(gè)ID序號(hào)。12位(bit)可以表示的最大正整數(shù)是java算法之靜態(tài)內(nèi)部類實(shí)現(xiàn)雪花算法,即可以用0、1、2、3、....4094這4095個(gè)數(shù)字,來(lái)表示同一機(jī)器同一時(shí)間截(毫秒)內(nèi)產(chǎn)生的4095個(gè)ID序號(hào)。

說(shuō)明 由于在Java中64bit的整數(shù)是long類型,所以在Java中SnowFlake算法生成的id就是long來(lái)存儲(chǔ)的。

二、靜態(tài)類部類單例模式生產(chǎn)雪花ID代碼

下面生成雪花ID的代碼可以用于線上分布式項(xiàng)目中來(lái)生成分布式主鍵ID,因?yàn)樵O(shè)計(jì)采用的靜態(tài)內(nèi)部類的單例模式,通過(guò)加synchronized鎖來(lái)保證在

同一個(gè)服務(wù)器線程安全。至于不同服務(wù)器其實(shí)是不相關(guān)的,因?yàn)樗鼈兊臋C(jī)器碼是不一致的,所以就算同一時(shí)刻兩臺(tái)服務(wù)器都產(chǎn)生了雪花ID,那也不會(huì)一樣的。

1、代碼

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

java算法之靜態(tài)內(nèi)部類實(shí)現(xiàn)雪花算法

從圖中我們可以得出

1、在100個(gè)線程并發(fā)下,生成20萬(wàn)條雪花ID的時(shí)間大概在1.6秒左右,所有所性能還是蠻ok的。

2、生成20萬(wàn)條雪花ID并沒(méi)有一條相同的ID,因?yàn)橛幸粭l就會(huì)拋出異常了。

3、為什么說(shuō)41位時(shí)間戳最長(zhǎng)只能有69年

我們思考41的二進(jìn)制,最大值也就41位都是1,也就是也就是說(shuō)41位可以表示java算法之靜態(tài)內(nèi)部類實(shí)現(xiàn)雪花算法

所以說(shuō)雪花算法生成的ID,只能保證69年內(nèi)不會(huì)重復(fù),如果超過(guò)69年的話,那就考慮換個(gè)服務(wù)器部署吧,并且要保證該服務(wù)器的ID和之前都沒(méi)有重復(fù)過(guò)。

以上就是java算法之靜態(tài)內(nèi)部類實(shí)現(xiàn)雪花算法的詳細(xì)內(nèi)容,更多關(guān)于java算法的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 室内室外厚型|超薄型|非膨胀型钢结构防火涂料_隧道专用防火涂料厂家|电话|价格|批发|施工 | 大功率金属激光焊接机价格_不锈钢汽车配件|光纤自动激光焊接机设备-东莞市正信激光科技有限公司 定制奶茶纸杯_定制豆浆杯_广东纸杯厂_[绿保佳]一家专业生产纸杯碗的厂家 | 丝杆升降机-不锈钢丝杆升降机-非标定制丝杆升降机厂家-山东鑫光减速机有限公司 | 智能汉显全自动量热仪_微机全自动胶质层指数测定仪-鹤壁市科达仪器仪表有限公司 | 石家庄小程序开发_小程序开发公司_APP开发_网站制作-石家庄乘航网络科技有限公司 | 玻璃瓶厂家_酱菜瓶厂家_饮料瓶厂家_酒瓶厂家_玻璃杯厂家_徐州东明玻璃制品有限公司 | 苗木价格-苗木批发-沭阳苗木基地-沭阳花木-长之鸿园林苗木场 | 洛阳永磁工业大吊扇研发生产-工厂通风降温解决方案提供商-中实洛阳环境科技有限公司 | 品牌策划-品牌设计-济南之式传媒广告有限公司官网-提供品牌整合丨影视创意丨公关活动丨数字营销丨自媒体运营丨数字营销 | 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 防水接头-电缆防水接头-金属-电缆密封接头-不锈钢电缆接头 | 除甲醛公司-甲醛检测治理-杭州创绿家环保科技有限公司-室内空气净化十大品牌 | 北京软件开发_软件开发公司_北京软件公司-北京宜天信达软件开发公司 | 山西3A认证|太原AAA信用认证|投标AAA信用证书-山西AAA企业信用评级网 | 宠物店加盟_宠物连锁店_开宠物店-【派多格宠物】 | 陕西视频监控,智能安防监控,安防系统-西安鑫安5A安防工程公司 | 等离子空气净化器_医用空气消毒机_空气净化消毒机_中央家用新风系统厂家_利安达官网 | 不锈钢复合板|钛复合板|金属复合板|南钢集团安徽金元素复合材料有限公司-官网 | 广州展览制作|展台制作工厂|展览设计制作|展览展示制作|搭建制作公司 | 河南15年专业网站建设制作设计,做网站就找郑州启凡网络公司 | 至顶网| 中视电广_短视频拍摄_短视频推广_短视频代运营_宣传片拍摄_影视广告制作_中视电广 | 视频直播 -摄影摄像-视频拍摄-直播分发 | 春腾云财 - 为企业提供专业财税咨询、代理记账服务 | 江苏皓越真空设备有限公司| 化妆品加工厂-化妆品加工-化妆品代加工-面膜加工-广东欧泉生化科技有限公司 | 厦门ISO认证|厦门ISO9001认证|厦门ISO14001认证|厦门ISO45001认证-艾索咨询专注ISO认证行业 | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | 运动木地板厂家,篮球场木地板品牌,体育场馆木地板安装 - 欧氏运动地板 | 医用空气消毒机-医用管路消毒机-工作服消毒柜-成都三康王 | 房间温控器|LonWorks|海思 | 活动策划,舞台搭建,活动策划公司-首选美湖上海活动策划公司 | 新材料分散-高速均质搅拌机-超声波分散混合-上海化烁智能设备有限公司 | 低气压试验箱_高低温低气压试验箱_低气压实验箱 |林频试验设备品牌 | PO膜_灌浆膜及地膜供应厂家 - 青州市鲁谊塑料厂 | 小区健身器材_户外健身器材_室外健身器材_公园健身路径-沧州浩然体育器材有限公司 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 水成膜泡沫灭火剂_氟蛋白泡沫液_河南新乡骏华消防科技厂家 | 冷轧机|两肋冷轧机|扁钢冷轧机|倒立式拉丝机|钢筋拔丝机|收线机-巩义市华瑞重工机械制造有限公司 | ETFE膜结构_PTFE膜结构_空间钢结构_膜结构_张拉膜_浙江萬豪空间结构集团有限公司 | 懂研帝_专业SCI论文润色机构_SCI投稿发表服务公司 |