Java 主键生成策略之雪花算法

概述

项目中为了缓解数据库服务器压力和提高并发量进行分库分表,在新增数据时,如果此时按照传统方式使用数据库主键自增,那么在并发下ID可能会冲突; 使用UUID的话又因其无序会产生页分裂导致磁盘IO过大使得系统性能降低;  经过了解雪花算法根据其特点可以解决分布式系统中生成高性能、趋势递增、全局唯一ID, 因此项目中使用雪花算法策略生成ID

雪花算法特点

  • 唯一性: 通过结合时间戳、机器ID和序列号,雪花算法可以生成几乎唯一的ID
  • 高性能: 雪花算法在内存中生成ID,无需访问数据库或其他外部服务,因此具有很高的性能
  • 趋势递增: 生成的ID是趋势递增的,这有助于数据库索引优化,提高查询效率
  • 去中心化每个节点可以独立生成ID,无需协调,适合分布式系统
  • 可定制性算法中的不同部分(时间戳、机器ID、序列号)可以根据实际需求进行调整
  • 扩展
    • 中心化生成主键方案
      • 基于SEQUENCE区间方案
      • 各数据库按特定步长自增
      • 基于redis生成自增序列
    • 去中心化生成主键方案
      • UUID生成无序的唯一ID
      • 雪花算法生成ID

项目最佳实践

  • 引入第三方依赖
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-core</artifactId>
</dependency>
  • 雪花Id生成工具类
import cn.hutool.core.lang.Snowflake;
import java.util.Random;public class SnowFlakeUtil {// 终端机器ID: 【0-31】private static long workerId = 1; // 数据中心ID: 【0-31】private static long dataCenterId = 1;private volatile static Snowflake snowflake; //雪花对象//静态块实现对象初始化static{Random rand=new Random();// 分布式环境下确保为每个实例配置了唯一的workerId和dataCenterId,以避免ID冲突,因此采取随机方法设置workerId = rand.nextInt(31)+1;//[1,31]内的随机整数dataCenterId = rand.nextInt(31)+1;//[1,31]内的随机整数snowflake = getInstance();}// Long型IDpublic static long nextId() {return snowflake.nextId();}// String类型IDpublic static String nextIdStr(){return snowflake.nextIdStr();}// 通过双重检测保证Snowflake对象在高并发下对象唯一private static Snowflake getInstance() {if (null == snowflake) {synchronized (SnowFlakeUtil.class) {if (null == snowflake) {snowflake = new Snowflake(workerId, dataCenterId);}}}return snowflake;}// 测试public static void main(String[] args) {System.out.println("IdLong: " + SnowFlakeUtil.nextId()); // IdLong:  1798609085217599488 雪花算法默认LongSystem.out.println("IdStr: " + SnowFlakeUtil.nextIdStr()); // IdStr: 1798609085217599489 某些场景下需要字符串类型}
}

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

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

相关文章

DockerCompose中部署Jenkins(Docker Desktop在windows上数据卷映射)

场景 DockerJenkinsGiteeMaven项目配置jdk、maven、gitee等拉取代码并自动构建以及遇到的那些坑&#xff1a; DockerJenkinsGiteeMaven项目配置jdk、maven、gitee等拉取代码并自动构建以及遇到的那些坑_jenkins的安装以及集成jdkgitmaven 提示警告-CSDN博客 Windows10(家庭版…

AI学习指南机器学习篇-逻辑回归正则化技术

AI学习指南机器学习篇-逻辑回归正则化技术 在机器学习领域&#xff0c;逻辑回归是一种常见的分类算法&#xff0c;它常用于处理二分类问题。在实际的应用中&#xff0c;为了提高模型的泛化能力和降低过拟合风险&#xff0c;逻辑回归算法通常会使用正则化技术。本文将介绍逻辑回…

待定待定待定

BindingNavigator C# 属性&#xff08;Property&#xff09; get set StringBuilder https://www.bilibili.com/video/BV15u4y1F72C/ C# 高级数据结构有哪些 List - 动态数组&#xff0c;可以动态增长和缩减&#xff0c;提供快速访问、添加和删除元素的功能。Dictionary<TK…

c#vb代码互转工具

下载地址&#xff1a; https://download.csdn.net/download/wgxds/88979921

EN 17104-2021室内用热塑性硬质保护墙板CE认证

室内用热塑性硬质保护墙板是指由同材质或非均质塑料板制成的&#xff0c;表面有或者没有装饰层&#xff0c;用于墙体的保护作用而非起结构作用&#xff0c;通过胶粘剂粘贴安装。 EN 17104-2021室内用热塑性硬质保护墙板CE认证项目 认证项目 测试标准 防火 EN 13501-1 挥发…

stm32中如何实现EXTI线 0 ~ 15与对应IO口的配置呢?

STM32的EXTI控制器支持19 个外部中断/ 事件请求。每个中断设有状态位&#xff0c;每个中断/ 事件都有独立的触发和屏蔽设置。 STM32的19个外部中断对应着19路中断线&#xff0c;分别是EXTI_Line0-EXTI_Line18&#xff1a; 线0~15&#xff1a;对应外部 IO口的输入中断。 线16&…

【MMU】——ARM 一级页表

文章目录 一级页表项即 entry 的格式如下 从上图可以看出 L1 页表项有四种可能类型 产生中止异常的故障条目。这可能是预取或数据中止、取决于访问类型。这实际上表示虚拟地址未映射 bit[1:0] = 00指向 L2 转换表的条目。这样就能将 1MB 的内存分页 bit[1:0] = 01。1MB 段转换…

STM32远程更新

1 IAP 概述 1.1 工作原理 在应用中编程&#xff08; IAP &#xff09;是一种在现场通过 MCU 的通信接口&#xff08;例如 UART,USB,CAN 和以太网 等&#xff09;进行固件升级的方式。 当启动微控制器时&#xff0c;您可以选择让它进入 IAP 模式以执行 IAP 代码&am…

Linux-用户管理与软件管理

用户授权 如果普通用户需要执行特殊操作&#xff0c;有两种方法 1、su - root 切换到root账号进行特殊操作&#xff0c;然后再返回到普通用户 2、sudo命令 命令&#xff1a;su 优点&#xff1a;使用简单 缺点&#xff1a;1、root密码容易泄露&#xff1b;2、普通用…

基于MBD开发汽车软件

MBD 原理及重要性 模型驱动开发(Model-Based Development,简称 MBD)是一种在现代工程领域中日益重要的方法。它的基本原理建立在以模型为核心的理念之上。 MBD 的核心概念包括模型的构建、使用和维护。模型在这里不仅仅是对系统或过程的简单描述,而是包含了丰富的信息和逻…

04-240606Spark笔记

04-240606Spark笔记 1.行动算子-2 save相关算子: 格式: def saveAsTextFile(path: String): Unit def saveAsObjectFile(path: String): Unit def saveAsSequenceFile(path: String,codec: Option[Class[_ <: CompressionCodec]] None): Unit 例子: val rdd sc.makeR…

【Python报错】已解决NameError: name ‘Image‘ is not defined

解决Python报错&#xff1a;NameError: name ‘Image’ is not defined 在使用Python进行图像处理时&#xff0c;我们经常使用Pillow库&#xff08;PIL的一个分支&#xff09;。如果你在尝试创建或处理图像时遇到了NameError: name Image is not defined的错误&#xff0c;这通…

史上最易懂的mysql锁 、mvvc分析

1 mysql中的锁类型&#xff1a; 1) 表锁 表共享锁(S):表级别的读锁&#xff0c;表共享锁之间是兼容的。 表排他锁(X): 表级别的写锁&#xff0c;表排他锁和任何锁(包括表排他锁)都不兼容(不包括意向锁)。 意向排他锁(IX): 获取行排他锁之前必须获取的意向排他锁&#xff0c;这…

关于python包导入问题的重思考

将顶层目录直接设置为一个包 像这样&#xff0c;每一个文件从顶层包开始导入 这样可以解决我的问题&#xff0c;但是要注意的时&#xff0c;要避免使用出现上下级出现同名包的情况&#xff0c;比如&#xff1a; AutoServer--AutoServer--__init__.py--__init__.py这种情况下…

腾讯云的身份证核验,找不到这个类

系统接入腾讯云的sdk&#xff0c;Class ‘TencentCloud\Common\Credential’ not found 以下方法核对一下看有没有做错&#xff0c;如果没有需要重启一下守护一般是能解决问的 这个错误表明PHP代码试图加载一个名为TencentCloud\Common\Credential的类&#xff0c;但是在指定…

绿联云NAS一些探索(1):SSH、包管理器探测、安装docker-compose等

绿联云NAS一些探索SSH、包管理器探测、安装docker-compose等 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https:…

AI图书推荐:《如何利用ChatGPT在线赚钱》

这本书《如何利用ChatGPT在线赚钱》&#xff08;$100m ChatGPT_ How To Make Money Online With ChatGPT -- Sharp, Biily -- 2023 &#xff09;主要阐述如何利用ChatGPT这一强大的语言模型工具在互联网上创造收入。 以下是各章节内容的概要&#xff1a; **引言** - 介绍了Chat…

STM32F103单片机工程移植到航顺单片机HK32F103注意事项

一、简介 作为国内MCU厂商中前三阵营之一的航顺芯片&#xff0c;建立了世界首创超低功耗7nA物联网、万物互联核心处理器浩瀚天际10X系列平台&#xff0c;接受代理商/设计企业/方案商定制低于自主研发十倍以上成本&#xff0c;接近零风险自主品牌产品&#xff0c;芯片设计完成只…

spring整合kafka

原文链接&#xff1a;spring整合kafka_spring集成kafka-CSDN博客 1、导入依赖 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>2.5.10.RELEASE</version> </depende…

Arthas Profiler 事件监控场景介绍

CPU 使用情况 (cpu) 场景描述&#xff1a; 当应用程序响应缓慢或者CPU使用率异常高时&#xff0c;开发者需要找出导致高CPU消耗的具体方法调用。通过监控CPU使用情况&#xff0c;可以识别出那些占用大量CPU时间的热点方法。 使用Arthas的步骤&#xff1a; 启动CPU profiler:…