当前位置: 首页 > news >正文

5 分布式ID

这里讲一个比较常用的分布式防重复的ID生成策略,雪花算法

一个用户体量比较大的分布式系统必然伴随着分表分库,分机房部署,单体的部署方式肯定是承载不了这么大的体量。

雪花算法的结构说明

如下图所示:
在这里插入图片描述

雪花算法组成

从上图我们可以看出来雪花算法是64bit位的long类型的数值型的id。其中由4部分组成。

1bit为固定为0,表明生成的id为正数。

41bit位毫秒级的时间戳(可保留69年的时间戳)

标识位为10位,由5位的机器id和5位的服务id组成。5bit位能标识32个数值,32*32=1024 共能表示1024个数值,也就是说我们部署的服务可以水平扩展至1024个实例部署。在国内的应用中基本上是够用了。

12位的序列号位,表示同一个实例在1毫秒内能生成4096个序列,基本上也是够用了。

如果按照水平扩展应用还不能够承载我们的体量,我们可以对上面的组成进行改造。比如我们一个应用实例不会在1毫秒生成4096个数值,我们可以把时间戳的值改成35位,把6个bit均分到机器id和服务id上,也就是说我们可以部署256*256=65536个实例。

雪花算法的具体实现代码如下:

/*** 雪花算法工具类* 64位long类型的= 第一位0表示为正数 + 1到41的时间戳 + 5位的数据中心id + 5位的机器id + 12位的序列号* @author yusong* @20241111*/
public class SnowflakeIdWorkerUtil {//开始时间戳 2025-01-01=1735660800000Lprivate final long startTime = 1731400000000L;//数据中心所占雪花算法数据的位数private final long datacenterIdBits = 5L;//机器号所占雪花算法的位数private final long workerIdBits = 5L;
//    //支持最大的数据中心 结果为31
//    private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
//    //支持最大的机器编号 结果为31
//    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);//同一时间戳生成的序列号所占位数private final long sequenceBits = 12L;//机器号左移位数=序列号的位数 = 12private final long workerIdShift = sequenceBits;//数据中心左移位数= 序列号的位数 + 机器号的位数 = 17private final long datacenterIdShift = sequenceBits + workerIdBits;//时间戳左移位数= 序列号的位数 + 机器号的位数 + 数据中心位数 = 22private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;//生成序列号的最大数=4095private final long sequenceMask = -1L ^ (-1L << sequenceBits);//数据中心编号private long datacenterId;//机器号private long workerId;//毫秒内序列从0开始private long sequence = 0L;//上次生成ID的时间截private long lastTimestamp = -1L;private static SnowflakeIdWorkerUtil sw = null;/**** @param datacenterId 数据中心编号id* @param workerId           机器编号id* @return*/public static synchronized SnowflakeIdWorkerUtil getSnowflakeId(long datacenterId,long workerId) {if(datacenterId>31||datacenterId<0) {throw new RuntimeException("datacenterId必须是0到31位的整数");}if(workerId>31||workerId<0) {throw new RuntimeException("workerId必须是0到31位的整数");}if(sw==null) {sw = new SnowflakeIdWorkerUtil();sw.datacenterId = datacenterId;sw.workerId = workerId;}return sw;}/*** 私有的构造函数 防止外部new*/private SnowflakeIdWorkerUtil() {}/*** 获取下一个id* @return*/public synchronized long nextId() {long timestamp = timeGen();//如果当前时间戳小于上次的时间戳 说明系统时钟回退过 应该抛出异常if(timestamp<this.lastTimestamp) {throw new RuntimeException("系统时钟回退异常,请检查系统设置");}//如果是同一时间戳生成id,则进行毫秒内序列if(this.lastTimestamp==timestamp) {sequence = (sequence + 1) & sequenceMask;//同一毫秒内序列溢出 则等待下一秒if(sequence==0) {timestamp = nextMillis(lastTimestamp);}}else {sequence = 0L;}this.lastTimestamp = timestamp;return ((timestamp - startTime)<<timestampLeftShift)|(datacenterId<<datacenterIdShift)|(workerId<<workerIdShift)|sequence;}/*** 阻塞到下一毫秒,直到获取到新的时间戳* @param lastTimestamp* @return*/private long nextMillis(long lastTimestamp) {long timestamp = timeGen();while (timestamp <= lastTimestamp) {timestamp = timeGen();}return timestamp;}/*** 获取当前的时间戳* @return*/private long timeGen() {return System.currentTimeMillis();}public static void main(String[] args) {for(int i=0;i<100;i++) {SnowflakeIdWorkerUtil swu = SnowflakeIdWorkerUtil.getSnowflakeId(0, 0);long id = swu.nextId();System.out.println(Long.toBinaryString(id));System.out.println(id);}}}

雪花算法有个问题就是不能进行时钟回拨,如果进行时钟回拨就会生成重复的id。如果我们考虑以上问题可以在我们的程序中保留最近一次的生成时间,并拿来做校验,就可解决这个问题。办法总比问题多。

相关文章:

5 分布式ID

这里讲一个比较常用的分布式防重复的ID生成策略&#xff0c;雪花算法 一个用户体量比较大的分布式系统必然伴随着分表分库&#xff0c;分机房部署&#xff0c;单体的部署方式肯定是承载不了这么大的体量。 雪花算法的结构说明 如下图所示: 雪花算法组成 从上图我们可以看…...

SpringBoot | @Autowired 和 @Resource 的区别及原理分析

关注&#xff1a;CodingTechWork 引言 在Spring框架中&#xff0c;Autowired 和 Resource 是两种常用的依赖注入注解&#xff0c;它们都用于自动装配Bean&#xff0c;简化了开发者手动创建和管理Bean的繁琐工作。然而&#xff0c;它们的实现机制和使用方式有所不同。理解这两者…...

『SQLite』解释执行(Explain)

摘要&#xff1a;本节主要讲解SQL的解释执行&#xff1a;Explain。 在 sqlite 语句之前&#xff0c;可以使用 “EXPLAIN” 关键字或 “EXPLAIN QUERY PLAN” 短语&#xff0c;用于描述表查询的细节。 基本语法 EXPLAIN 语法&#xff1a; EXPLAIN [SQLite Query]EXPLAIN QUER…...

0基础学前端-----CSS DAY12

视频参考&#xff1a;B站Pink老师 今天是CSS学习的第十二天&#xff0c;今天开始的笔记对应Pink老师课程中的CSS第七天的内容。 本节重点&#xff1a;CSS高级技巧 本章目录 本节目标1. 精灵图1.1 为什么需要精灵图1.2 精灵图使用案例&#xff1a;拼出自己的名字 2. 字体图标2.…...

(概率论)无偏估计

参考文章&#xff1a;(15 封私信 / 51 条消息) 什么是无偏估计&#xff1f; - 知乎 (zhihu.com) 首先&#xff0c;第一个回答中&#xff0c;马同学图解数学讲解得很形象&#xff0c; 我的概括是&#xff1a;“注意&#xff0c;有一个总体的均值u。然后&#xff0c;如果抽样n个&…...

Minio-Linux-安装

文章目录 1.Linux安装1.下载源码包2.上传到/usr/local/minio1.进入目录2.上传 3.开放执行权限4.创建minio文件存储目录及日志目录5.编写启动的shell脚本1.脚本编写2.赋予执行权限 6.启动&#xff01;1.执行run脚本2.查看日志3.开放9001和9000端口1.服务器2.安全组3.访问&#x…...

利用Java爬取1688商品详情API接口:技术与应用指南

引言 1688作为中国领先的B2B电子商务平台&#xff0c;拥有海量的商品信息。对于商家和市场研究人员来说&#xff0c;能够从1688获取商品详情信息&#xff0c;对于市场分析、竞品研究等具有重要价值。本文将详细介绍如何使用Java编写爬虫程序&#xff0c;以合法、高效的方式获取…...

基于MATLAB的汽车热管理模型构建

一、引言 汽车热管理系统对汽车性能、部件寿命及驾乘体验至关重要。它能确保发动机、电池等关键部件在适宜温度工作。MATLAB 功能强大&#xff0c;为构建高精度热管理模型提供有效途径&#xff0c;助力优化系统设计与控制策略。 二、汽车热管理系统构成 2.1 发动机冷却系统&…...

LRU(1)

LRU是"Least Recently Used"(最近最少使用)的缩写&#xff0c;它是一种常用的页面置换算法和缓存淘汰策略。当计算机系统的内存或缓存资源有限时&#xff0c;LRU算法根据的历史访问记录来决定哪些数据应该被保留在内存或缓存中&#xff0c;哪些被淘汰。其核心思想是“…...

VSCode 使用鼠标滚轮控制字体

一、 文件 | 首选项 | 设置 二、单击在 settings.json中编辑 "editor.mouseWheelZoom": true 注注注意&#xff1a;保存哦&#xff01;ctrlS 三、测试 按住ctrl鼠标滚轮&#xff0c;控制字体大小...

数据库(3)--针对列的CRUD操作

1.Create 新增 语法&#xff1a; insert into 表名 &#xff08;列名&#xff09;values &#xff08;列&#xff09;... 创建一个学生表用于演示&#xff1a; create table if not exists student( id bigint comment 编号, name varchar(20) comment 姓名 ); 1.1直接增加…...

【Linux】记录一下考RHCE的学习过程(七)

年底了&#xff0c;公司接的北京地铁轨道交通的项目做不完了&#xff0c;一百多列地铁的设备都得调&#xff0c;派我出差了几周&#xff0c;这几天才回来&#xff0c;出差累死了实在是没办法更新。&#xff08;YOASOBI的二开票还没抢到ToT&#xff0c;哭死&#xff0c;看看回滚…...

【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 1:背景动机

目录 1 简单概括2 几个重要发现3 主要贡献4 背景知识5 方法简介 论文&#xff1a;Multi-Head Encoding for Extreme Label Classification 作者&#xff1a;Daojun Liang, Haixia Zhang, Dongfeng Yuan and Minggao Zhang 单位&#xff1a;山东大学 代码&#xff1a;https://gi…...

使用hardhat进行合约测试

演示源码&#xff1a;hardhat-demo: 演示基于hardhat的HelloWord合约测试案例。 环境 NodeJs 创建工程 1.创建一个hardhat工程根目录(hardhat-demo)&#xff0c;然后进入该目录执行。 npx hardhat执行该命令&#xff0c;会进行hardhat工程初始化。 提示我们是否安装该版本h…...

基于生成式对抗网络(GAN)的前沿研究与应用

引言 人工智能&#xff08;AI&#xff09;领域在过去几年中经历了快速的发展&#xff0c;尤其是深度学习的兴起带来了许多变革。其中&#xff0c;生成式对抗网络&#xff08;Generative Adversarial Network, GAN&#xff09;因其强大的生成能力成为了研究热点。自2014年Ian G…...

Apache zookeeper集群搭建

文章目录 引言I 集群搭建保证服务器基础环境一致JDK安装与配置环境变量安装与修改zk配置文件同步zk安装包与配置文件zk集群启停查看进程、状态、日志II 扩展:shell脚本一键启停引言 springCloud 脚手架项目功能模块:Java分布式锁 https://blog.csdn.net/z929118967/article/d…...

cmake使用记录

Android相关 编译一个动态库&#xff0c;到指定的目录 cmake_minimum_required(VERSION 3.22.1) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../v2x_algo_output/${ANDROID_ABI}) project("serial_port") include_directories(include) add_…...

nginx http反向代理

系统&#xff1a;Ubuntu_24.0.4 1、安装nginx sudo apt-get update sudo apt-get install nginx sudo systemctl start nginx 2、配置nginx.conf文件 /etc/nginx/nginx.conf&#xff0c;但可以在 /etc/nginx/sites-available/ 目录下创建一个新的配置文件&#xff0c;并在…...

实数的奥秘:柯西序列深度解析

实数的奥秘&#xff1a;柯西序列深度解析 一、柯西序列的概念与性质二、柯西序列定义无理数三、柯西序列定义实数系统 实数&#xff0c;是初中学到的概念&#xff0c;我知都知道它是有理数和无理数的统称。 然而&#xff0c;实数可不只是小数点后的一堆零碎儿&#xff0c;它背后…...

信息系统管理师试题-人力资源

信息系统管理师试题-人力资源 当组织计划的人力资源需求超过供给时&#xff0c;可通过下列方法解决&#xff0c;其中不包括&#xff08;&#xff09; A降低录用标准&#xff0c;招聘新员工 B增加临时性员工和使用退休员工 C减少加班数量或工作时间 D提高员工工作效率 答案C 下…...

QQ音乐解码神器qmcdump:5分钟快速解锁加密音乐文件的完整指南

QQ音乐解码神器qmcdump&#xff1a;5分钟快速解锁加密音乐文件的完整指南 【免费下载链接】qmcdump 一个简单的QQ音乐解码&#xff08;qmcflac/qmc0/qmc3 转 flac/mp3&#xff09;&#xff0c;仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump …...

FRCRN(16k单麦)效果惊艳:雨天户外采访录音中分离人声与雨滴噪声

FRCRN&#xff08;16k单麦&#xff09;效果惊艳&#xff1a;雨天户外采访录音中分离人声与雨滴噪声 1. 项目概述 FRCRN&#xff08;Frequency-Recurrent Convolutional Recurrent Network&#xff09;是阿里巴巴达摩院在ModelScope社区开源的单通道语音降噪模型&#xff0c;专…...

Qwen3-Reranker效果展示:政府公文写作中政策依据与原文段落匹配

Qwen3-Reranker效果展示&#xff1a;政府公文写作中政策依据与原文段落匹配 1. 引言&#xff1a;政策公文写作的精准匹配挑战 在政府公文写作过程中&#xff0c;准确引用相关政策依据是确保文件权威性和合规性的关键环节。传统的检索方式往往面临语义理解不深、匹配精度不足的…...

Android设备标识终极解决方案:Android_CN_OAID技术深度解析与最佳实践

Android设备标识终极解决方案&#xff1a;Android_CN_OAID技术深度解析与最佳实践 【免费下载链接】Android_CN_OAID 安卓设备唯一标识解决方案&#xff0c;可替代移动安全联盟&#xff08;MSA&#xff09;统一 SDK 闭源方案。包括国内手机厂商的开放匿名标识&#xff08;OAID&…...

婚恋平台用户画像优化:GPEN提升头像吸引力与真实性

婚恋平台用户画像优化&#xff1a;GPEN提升头像吸引力与真实性 1. 项目背景与核心价值 在婚恋社交平台中&#xff0c;用户头像的质量直接影响第一印象和匹配成功率。模糊、低质或失真的头像往往导致用户信任度下降和互动率降低。传统的美颜工具虽然能调整肤色和轮廓&#xff…...

Web Scraper完整指南:零代码网页数据抓取终极解决方案

Web Scraper完整指南&#xff1a;零代码网页数据抓取终极解决方案 【免费下载链接】web-scraper-chrome-extension Web data extraction tool implemented as chrome extension 项目地址: https://gitcode.com/gh_mirrors/we/web-scraper-chrome-extension Web Scraper是…...

3分钟搞定风扇噪音!FanControl让你的电脑从此安静如初

3分钟搞定风扇噪音&#xff01;FanControl让你的电脑从此安静如初 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa…...

中药小分子靶点筛选实战:8种主流技术优缺点对比与选型指南

中药小分子靶点筛选实战&#xff1a;8种主流技术优缺点对比与选型指南 在中药现代化研究的浪潮中&#xff0c;小分子靶点筛选技术正成为连接传统药效与现代药理的关键桥梁。不同于西药研发中常见的单靶点策略&#xff0c;中药小分子往往展现出"多靶点、多通路"的复杂…...

ANIMATEDIFF PRO新手必看:简单三步,用文字生成高质量动态GIF

ANIMATEDIFF PRO新手必看&#xff1a;简单三步&#xff0c;用文字生成高质量动态GIF 1. 从文字到动态影像的魔法 想象一下&#xff0c;你只需要输入一段文字描述&#xff0c;就能在短短25秒内获得一段16帧的电影级动态GIF。这不是科幻电影的情节&#xff0c;而是ANIMATEDIFF …...

CLAP模型在工业质检的应用:设备异常声音诊断

CLAP模型在工业质检的应用&#xff1a;设备异常声音诊断 1. 引言 在工业4.0时代&#xff0c;设备预测性维护成为制造业降本增效的关键环节。传统工业设备故障诊断往往依赖人工巡检和经验判断&#xff0c;不仅效率低下&#xff0c;还存在漏检误判的风险。特别是对于旋转机械、…...