雪花算法的使用

雪花算法的使用(工具类utils)

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;// 雪花算法
@Component
public class SnowflakeUtils {
//    Generated ID: 1724603634882318341;
//    Generated ID: 1724603717312974850
//    Generated ID: 1724603717312974851public static void main(String[] args) {// 创建一个 SnowflakeUtils 实例SnowflakeUtils snowflakeUtils = new SnowflakeUtils(1, 1);// 生成10个唯一ID并打印for (int i = 0; i < 10; i++) {long id = snowflakeUtils.nextId();System.out.println("Generated ID: " + id);}}// 工作机器IDprivate final long workerId;public SnowflakeUtils() {this.workerId = 1L;  // 设置默认值this.dataCenterId = 1L;  // 设置默认值// 初始化雪花算法实例}public SnowflakeUtils(@Value("${snowflake.workerId}") long workerId) {this.workerId = workerId;// 初始化雪花算法实例}//    public SnowflakeUtils(@Value("${snowflake.workerId}") long workerId,@Value("${snowflake.dataCenterId}") long dataCenterId) {
//           this.workerId = workerId;
//           this.dataCenterId = dataCenterId;
//       }// 起始的时间戳private final long twepoch = 1288834974657L;// 机器ID所占的位数private final long workerIdBits = 5L;// 数据标识ID所占的位数private final long dataCenterIdBits = 5L;// 支持的最大机器ID,结果是31private final long maxWorkerId = -1L ^ (-1L << workerIdBits);// 支持的最大数据标识ID,结果是31private final long maxDataCenterId = -1L ^ (-1L << dataCenterIdBits);// 序列在ID中占的位数private final long sequenceBits = 12L;// 机器ID的偏移量(12)private final long workerIdShift = sequenceBits;// 数据标识ID的偏移量(12+5)private final long dataCenterIdShift = sequenceBits + workerIdBits;// 时间戳的偏移量(12+5+5)private final long timestampLeftShift = sequenceBits + workerIdBits + dataCenterIdBits;// 生成序列的掩码,这里为4095private final long sequenceMask = -1L ^ (-1L << sequenceBits);// 数据中心IDprivate long dataCenterId;// 毫秒内序列private long sequence = 0L;// 上次生成ID的时间截private long lastTimestamp = -1L;public SnowflakeUtils(long workerId, long dataCenterId) {if (workerId > maxWorkerId || workerId < 0) {throw new IllegalArgumentException("workerId can't be greater than " + maxWorkerId + " or less than 0");}if (dataCenterId > maxDataCenterId || dataCenterId < 0) {throw new IllegalArgumentException("dataCenterId can't be greater than " + maxDataCenterId + " or less than 0");}this.workerId = workerId;this.dataCenterId = dataCenterId;}// 生成IDpublic synchronized long nextId() {long timestamp = timeGen();if (timestamp < lastTimestamp) {throw new RuntimeException("Clock moved backwards. Refusing to generate id for " + (lastTimestamp - timestamp) + " milliseconds.");}if (lastTimestamp == timestamp) {sequence = (sequence + 1) & sequenceMask;if (sequence == 0) {timestamp = tilNextMillis(lastTimestamp);}} else {sequence = 0L;}lastTimestamp = timestamp;return ((timestamp - twepoch) << timestampLeftShift) |(dataCenterId << dataCenterIdShift) |(workerId << workerIdShift) |sequence;}private long tilNextMillis(long lastTimestamp) {long timestamp = timeGen();while (timestamp <= lastTimestamp) {timestamp = timeGen();}return timestamp;}private long timeGen() {return System.currentTimeMillis();}
}

调用雪花算法工具类

long snowflakeUtils= snowflakeUtils.nextId();

雪花算法(Snowflake Algorithm)是一种用于生成唯一ID的分布式算法。它最初是由Twitter开发的,用于生成分布式系统中的唯一标识符。雪花算法的核心思想是将一个64位的整数ID分成多个部分,每个部分表示不同的信息。

雪花算法的结构一般包括:

  1. 时间戳(41位): 用于表示生成ID的时间戳,精确到毫秒级别。
  2. 机器ID(10位): 用于标识生成ID的机器,确保每个机器都有唯一的标识符。
  3. 序列号(12位): 在同一毫秒内生成的ID的计数器,确保同一机器同一时间戳内产生不同的ID。

优点:

  1. 唯一性: 雪花算法生成的ID在分布式系统中是唯一的,不同机器生成的ID不会重复。
  2. 趋势递增: 生成的ID按时间有序递增,有助于提高数据库索引性能。
  3. 分布式: 雪花算法适用于分布式环境,每台机器生成ID不依赖于中心化的资源分配。

缺点:

  1. 时钟回拨问题: 如果系统时钟发生回拨,可能会导致生成的ID不是严格递增的。
  2. 依赖机器ID: 需要分配唯一的机器ID,可能需要一定的管理和配置。
  3. 有限的并发: 在同一毫秒内生成的ID并发量有限,最多只能生成4096个不同的ID。

总体来说,雪花算法是一种简单且高效的分布式ID生成方案,但在特定场景下需要注意其一些缺点。后续再补充。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/152066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Databend 开源周报第 120 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 使用自定义 CON…

常见Web安全

一.Web安全概述 以下是百度百科对于web安全的解释&#xff1a; Web安全&#xff0c;计算机术语&#xff0c;随着Web2.0、社交网络、微博等等一系列新型的互联网产品的诞生&#xff0c;基于Web环境的互联网应用越来越广泛&#xff0c;企业信息化的过程中各种应用都架设在Web平台…

java mybatisplus generator 修改字段类型

最新版生成代码的指定字段类型 FastAutoGenerator .dataSourceConfig(config -> {config.typeConvertHandler(new ITypeConvertHandler() {Overridepublic NotNull IColumnType convert(GlobalConfig globalConfig, TypeRegistry typeRegistry, TableField.MetaInfo metaIn…

【框架整合】Redis限流方案

1、Redis实现限流方案的核心原理&#xff1a; redis实现限流的核心原理在于redis 的key 过期时间&#xff0c;当我们设置一个key到redis中时&#xff0c;会将key设置上过期时间&#xff0c;这里的实现是采用lua脚本来实现原子性的。2、准备 引入相关依赖 <dependency>…

MySQL 之多版本并发控制 MVCC

MySQL 之多版本并发控制 MVCC 1、MVCC 中的两种读取方式1.1、快照读1.2、当前读 2、MVCC实现原理之 ReadView2.1、隐藏字段2.2、ReadView2.3、读已提交和可重复读隔离级别下&#xff0c;产生 ReadView 时机的区别 3、MVCC 解决幻读4、总结 MVCC&#xff08;多版本并发控制&…

springboot引入第三方jar包放到项目目录中,添加web.xml

参考博客&#xff1a;https://www.cnblogs.com/mask-xiexie/p/16086612.html https://zhuanlan.zhihu.com/p/587605618 1、在resources目录下新建lib文件夹&#xff0c;将jar包放到lib文件夹中 2、修改pom.xml文件 <dependency><groupId>com.lanren312</grou…

android 点击EdiText 禁止弹出系统键盘

找了很多都不好用&#xff0c;最后使用 editText.setShowSoftInputOnFocus(false); editText.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {Overridepublic void onGlobalLayout() {InputMethodManager imm (InputMetho…

YOLOv8-Seg改进:Backbone改进 |Next-ViT堆栈NCB和NTB 构建先进的CNN-Transformer混合架构

🚀🚀🚀本文改进:Next-ViT堆栈NCB和NTB 构建先进的CNN-Transformer混合架构,包括nextvit_small, nextvit_base, nextvit_large,相比较yolov8-seg各个版本如下: layersparametersgradientsGFLOPsnextvit_small61033841075

网络运维与网络安全 学习笔记2023.11.18

网络运维与网络安全 学习笔记 第十九天 今日目标 冲突域和交换机工作原理、广播域和VLAN原理 VLAN配置、TRUNK原理与配置、HYBRID原理与配置 冲突域和交换机工作原理 冲突域概述 定义 网络设备发送的数据&#xff0c;产生冲突的区域&#xff08;范围&#xff09; 对象 “数…

使用Generator处理二叉树的中序遍历

二叉树的中序遍历 let arr [[[a], b, [c]], d, [[e], f, [g]]] class Tree {constructor(left,root,right) { // 一棵树具有根节点&#xff0c;左孩子节点和右孩子节点this.left left;this.root root;this.right right;} } // 将数组构造为树的处理函数 function arrToTre…

【Java 进阶篇】Ajax 实现——JQuery 实现方式 `ajax()`

嗨&#xff0c;亲爱的读者们&#xff01;欢迎来到这篇关于使用 jQuery 中的 ajax() 方法进行 Ajax 请求的博客。在前端开发中&#xff0c;jQuery 提供了简便而强大的工具&#xff0c;其中 ajax() 方法为我们处理异步请求提供了便捷的解决方案。无需手动创建 XMLHttpRequest 对象…

利用AlphaMissense准确预测蛋白质组范围内的错义变体效应

Editor’s summary 蛋白质中单个氨基酸的变化有时影响不大&#xff0c;但通常会导致蛋白质折叠、活性或稳定性方面的问题。只有一小部分变体进行了实验研究&#xff0c;但有大量的生物序列数据适合用作机器学习方法的训练数据。程等人开发了AlphaMissense&#xff0c;这是一种…

浅析ChatGPT中涉及到的几种技术点

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

Hafnium之中断管理机制

目录 1. GIC所有权 2. 非安全中断处理 3. 安全中断处理 4. 安全中断信号机制

航测三维实景:创造更加真实和精细的虚拟环境

航测三维实景&#xff1a;创造更加真实和精细的虚拟环境 航测三维实景技术是一项以航空摄影测量为基础&#xff0c;结合计算机图像处理和显示技术的高精度三维实景重建方法。它以其独特的视角和真实感十足的体验&#xff0c;已经广泛应用于城市规划、土地资源管理、自然资源调查…

MongoDB备份与恢复以及导入导出

MongoDB备份与恢复 1、mongodump数据备份 在Mongodb中我们使用mongodump命令来备份MongoDB数据。该命令可以导出所有数据 (数据和数据结构) 或指定数据&#xff08;集合、部分集合内容&#xff09;到指定目录中。 语法&#xff1a; mongodump -h dbhost -d dbname -o dbdirec…

大数据时代,怎样通过日志分析保护我们的数据!

在今天的大数据时代&#xff0c;大量的数据被生成和存储。对于IT行业来说&#xff0c;日志文件是宝贵的信息财富。 通过合理的日志分析和解读&#xff0c;可以帮助企业提高运维效率、加强安全防护、改进产品质量和优化用户体验&#xff0c;本文将深入探讨日志分析在IT中的重要性…

基于R语言平台Biomod2模型的物种分布建模与可视化分析

!](https://img-blog.csdnimg.cn/84e1cc8c7f9b4b6ab60903ffa17d82f0.jpeg#pic_center)

设计模式-状态模式-笔记

状态模式State 在组件构建过程中&#xff0c;某些对象的状态经常面临变化&#xff0c;如何对这些变化进行有效的管理&#xff1f;同时又维持高层模块的稳定&#xff1f;“状态变化”模式为这一问题提供了一种解决方案。 经典模式&#xff1a;State、Memento 动机&#xff08…

【飞控调试】DJIF450机架+Pixhawk6c mini+v1.13.3固件+好盈Platinium 40A电调无人机调试

1 背景 由于使用了一种新的航电设备组合&#xff0c;在调试无人机起飞的时候遇到了之前没有遇到的问题。之前用的飞控&#xff08;Pixhawk 6c&#xff09;和电调&#xff08;Hobbywing X-Rotor 40A&#xff09;&#xff0c;在QGC里按默认参数配置来基本就能平稳飞行&#xff0…