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生成策略,雪花算法 一个用户体量比较大的分布式系统必然伴随着分表分库,分机房部署,单体的部署方式肯定是承载不了这么大的体量。 雪花算法的结构说明 如下图所示: 雪花算法组成 从上图我们可以看…...
SpringBoot | @Autowired 和 @Resource 的区别及原理分析
关注:CodingTechWork 引言 在Spring框架中,Autowired 和 Resource 是两种常用的依赖注入注解,它们都用于自动装配Bean,简化了开发者手动创建和管理Bean的繁琐工作。然而,它们的实现机制和使用方式有所不同。理解这两者…...
『SQLite』解释执行(Explain)
摘要:本节主要讲解SQL的解释执行:Explain。 在 sqlite 语句之前,可以使用 “EXPLAIN” 关键字或 “EXPLAIN QUERY PLAN” 短语,用于描述表查询的细节。 基本语法 EXPLAIN 语法: EXPLAIN [SQLite Query]EXPLAIN QUER…...

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

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

Minio-Linux-安装
文章目录 1.Linux安装1.下载源码包2.上传到/usr/local/minio1.进入目录2.上传 3.开放执行权限4.创建minio文件存储目录及日志目录5.编写启动的shell脚本1.脚本编写2.赋予执行权限 6.启动!1.执行run脚本2.查看日志3.开放9001和9000端口1.服务器2.安全组3.访问&#x…...
利用Java爬取1688商品详情API接口:技术与应用指南
引言 1688作为中国领先的B2B电子商务平台,拥有海量的商品信息。对于商家和市场研究人员来说,能够从1688获取商品详情信息,对于市场分析、竞品研究等具有重要价值。本文将详细介绍如何使用Java编写爬虫程序,以合法、高效的方式获取…...
基于MATLAB的汽车热管理模型构建
一、引言 汽车热管理系统对汽车性能、部件寿命及驾乘体验至关重要。它能确保发动机、电池等关键部件在适宜温度工作。MATLAB 功能强大,为构建高精度热管理模型提供有效途径,助力优化系统设计与控制策略。 二、汽车热管理系统构成 2.1 发动机冷却系统&…...
LRU(1)
LRU是"Least Recently Used"(最近最少使用)的缩写,它是一种常用的页面置换算法和缓存淘汰策略。当计算机系统的内存或缓存资源有限时,LRU算法根据的历史访问记录来决定哪些数据应该被保留在内存或缓存中,哪些被淘汰。其核心思想是“…...

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

数据库(3)--针对列的CRUD操作
1.Create 新增 语法: insert into 表名 (列名)values (列)... 创建一个学生表用于演示: create table if not exists student( id bigint comment 编号, name varchar(20) comment 姓名 ); 1.1直接增加…...

【Linux】记录一下考RHCE的学习过程(七)
年底了,公司接的北京地铁轨道交通的项目做不完了,一百多列地铁的设备都得调,派我出差了几周,这几天才回来,出差累死了实在是没办法更新。(YOASOBI的二开票还没抢到ToT,哭死,看看回滚…...

【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 1:背景动机
目录 1 简单概括2 几个重要发现3 主要贡献4 背景知识5 方法简介 论文:Multi-Head Encoding for Extreme Label Classification 作者:Daojun Liang, Haixia Zhang, Dongfeng Yuan and Minggao Zhang 单位:山东大学 代码:https://gi…...

使用hardhat进行合约测试
演示源码:hardhat-demo: 演示基于hardhat的HelloWord合约测试案例。 环境 NodeJs 创建工程 1.创建一个hardhat工程根目录(hardhat-demo),然后进入该目录执行。 npx hardhat执行该命令,会进行hardhat工程初始化。 提示我们是否安装该版本h…...
基于生成式对抗网络(GAN)的前沿研究与应用
引言 人工智能(AI)领域在过去几年中经历了快速的发展,尤其是深度学习的兴起带来了许多变革。其中,生成式对抗网络(Generative Adversarial Network, GAN)因其强大的生成能力成为了研究热点。自2014年Ian G…...
Apache zookeeper集群搭建
文章目录 引言I 集群搭建保证服务器基础环境一致JDK安装与配置环境变量安装与修改zk配置文件同步zk安装包与配置文件zk集群启停查看进程、状态、日志II 扩展:shell脚本一键启停引言 springCloud 脚手架项目功能模块:Java分布式锁 https://blog.csdn.net/z929118967/article/d…...
cmake使用记录
Android相关 编译一个动态库,到指定的目录 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反向代理
系统: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,但可以在 /etc/nginx/sites-available/ 目录下创建一个新的配置文件,并在…...

实数的奥秘:柯西序列深度解析
实数的奥秘:柯西序列深度解析 一、柯西序列的概念与性质二、柯西序列定义无理数三、柯西序列定义实数系统 实数,是初中学到的概念,我知都知道它是有理数和无理数的统称。 然而,实数可不只是小数点后的一堆零碎儿,它背后…...
信息系统管理师试题-人力资源
信息系统管理师试题-人力资源 当组织计划的人力资源需求超过供给时,可通过下列方法解决,其中不包括() A降低录用标准,招聘新员工 B增加临时性员工和使用退休员工 C减少加班数量或工作时间 D提高员工工作效率 答案C 下…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...