当前位置: 首页 > 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 下…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...