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

分布式项目中使用雪花算法提前获取对象主键ID

hello,大家好,我是灰小猿!

在做分布式项目开发进行数据表结构设计时,有时候为了提高查询性能,在进行数据库表设计时,会使用自增ID来代替UUID作为数据的主键ID,但是这样就会有一个问题,数据的自增ID应该如何获取到下一个ID并且插入到库中呢?

如果你使用的是mybatisPlus,可以使用自带的自增注解加在id字段上即可,这样在数据入库时就可以自动给数据赋值自增的主键ID,

但是对于不是使用mybatisPlus或者在数据插入之前就需要获取到对象的主键ID的情况,这种方式就变得不是那么友好,所以今天给大家分享一个使用雪花算法的方式提前获取对象的自增主键ID的方法。

下面是一个实际的使用示例,演示如何在分布式项目中使用雪花算法提前获取对象主键ID。

步骤 1: 添加依赖

首先,你需要在项目中添加雪花算法的依赖。如果你使用的是 Maven,可以在 pom.xml 中添加以下内容:

<dependency><groupId>com.github.f4b6a3</groupId><artifactId>snowflake-id-worker</artifactId><version>1.0.0</version>
</dependency>

步骤 2: 创建雪花算法ID生成器

创建一个 IdGenerator 类来生成雪花算法的ID:

import com.github.f4b6a3.snowflake.Snowflake; 
public class IdGenerator {private static final Snowflake snowflake = new Snowflake(1, 1); // 自定义机器ID和数据中心ID public static Long generateId() {return snowflake.nextId(); } 
}

步骤 3: 在实体类中使用ID生成器

在你的实体类中,使用 IdGenerator 生成ID:

import com.baomidou.mybatisplus.annotation.IdType; 
import com.baomidou.mybatisplus.annotation.TableId; 
import com.baomidou.mybatisplus.annotation.TableName; @TableName("my_entity") 
public class MyEntity { // 让MyBatis-Plus使用自定义ID @TableId(type = IdType.INPUT) private Long id;private String name; // 其他字段的getter和setter public MyEntity() { // 使用雪花算法生成ID this.id = IdGenerator.generateId(); }
}

步骤 4: 使用实体类

以在Service层调用为例,在你的服务层或控制器中创建 MyEntity 实例:

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; @Service 
public class MyEntityService {// MyBatis-Plus的Mapper接口 @Autowiredprivate MyEntityMapper myEntityMapper; public void createEntity(String name) {MyEntity entity = new MyEntity(); entity.setName(name); // 插入到数据库 myEntityMapper.insert(entity); } 
}

步骤 5: 配置MyBatis-Plus

确保你的 MyBatis-Plus 配置在 application.ymlapplication.properties 中正确设置:

mybatis-plus:global-config:db-config:id-type: auto

这样,当你创建 MyEntity 实例时,IdGenerator 会使用雪花算法生成唯一的主键ID。然后,你可以将实体对象插入到数据库中,主键ID将在对象创建时就被设置好。

下面我们介绍一下雪花算法使用的原理:

雪花算法原理

雪花算法生成唯一自增ID的原理主要依赖于以下几个方面:

  1. 时间戳:雪花算法的ID包含一个时间戳部分,表示当前时间。这个时间戳部分是自定义的,从一个固定的时间点开始计数(通常是系统启动时间或某个纪元),可以精确到毫秒级别。这使得ID在同一毫秒内生成的多个ID不会重复。

  2. 机器ID:雪花算法还包括机器ID(数据中心ID和工作机器ID)。这保证了在分布式系统中,不同的机器生成的ID不会冲突。通过将机器ID嵌入到生成的ID中,每台机器生成的ID都具有唯一性。

  3. 序列号:在同一毫秒内生成多个ID时,雪花算法会使用序列号来区分这些ID。序列号是自增的,可以在同一毫秒内生成多个唯一的ID。

  4. 位移:生成的ID是一个长整型值(64位),其中不同的位被分配给时间戳、机器ID和序列号。例如,时间戳占用高位,机器ID占用中间位,序列号占用低位。这样可以保证在时间和机器维度上的唯一性。

雪花算法的ID结构示例

假设一个64位的ID结构:

  • 1位: 符号位,始终为0。

  • 41位: 时间戳部分,表示自定义纪元以来的毫秒数。

  • 10位: 机器ID,分为数据中心ID和机器ID。

  • 12位: 序列号,用于同一毫秒内的不同ID。

这种设计允许在高并发环境中生成大量的唯一ID,且保证在不同机器上生成的ID是唯一的。通过将时间戳、机器ID和序列号结合,雪花算法能够有效地避免ID冲突。

以上就是在分布式项目中使用雪花算法提前获取对象主键ID的方法,

除此之外还有利用Redis分别获取每一个对象自增ID的方式,感兴趣的也可以了解一下。

我是灰小猿,我们下期见!

相关文章:

分布式项目中使用雪花算法提前获取对象主键ID

hello&#xff0c;大家好&#xff0c;我是灰小猿&#xff01; 在做分布式项目开发进行数据表结构设计时&#xff0c;有时候为了提高查询性能&#xff0c;在进行数据库表设计时&#xff0c;会使用自增ID来代替UUID作为数据的主键ID&#xff0c;但是这样就会有一个问题&#xff…...

小程序多个set-cookie无法处理

1、情景&#xff1a; 项目中遇到一个问题&#xff0c;客户的服务器上了华为云的防火墙&#xff0c;导致小程序请求头中携带了3个set- cookie&#xff08;有两个是华为云给自动加的&#xff09;&#xff0c;而小程序端不知道用哪个来 处理&#xff0c;结果选了个错误的进行处理…...

Mybatis【分页插件,缓存,一级缓存,二级缓存,常见缓存面试题】

文章目录 MyBatis缓存分页延迟加载和立即加载什么是立即加载&#xff1f;什么是延迟加载&#xff1f;延迟加载/懒加载的配置 缓存什么是缓存&#xff1f;缓存的术语什么是MyBatis 缓存&#xff1f;缓存的适用性缓存的分类一级缓存引入案例一级缓存的配置一级缓存的工作流程一级…...

【Qt开发】QT6.5.3安装方法(使用国内源)亲测可行!!!

目录 &#x1f315;下载在线安装包&#x1f315; 把安装包放到系统盘&#x1f315;开始安装&#x1f315;参考文章 &#x1f315;下载在线安装包 https://mirrors.nju.edu.cn/qt/official_releases/online_installers/ &#x1f315; 把安装包放到系统盘 我的系统盘是G盘&…...

springblade-JWT认证缺陷漏洞CVE-2021-44910

漏洞成因 SpringBlade前端通过webpack打包发布的&#xff0c;可以从其中找到app.js获取大量接口 然后直接访问接口&#xff1a;api/blade-log/api/list 直接搜索“请求未授权”&#xff0c;定位到认证文件&#xff1a;springblade/gateway/filter/AuthFilter.java 后面的代码…...

Chapter 12 Vue CLI脚手架组件化开发

欢迎大家订阅【Vue2Vue3】入门到实践 专栏&#xff0c;开启你的 Vue 学习之旅&#xff01; 文章目录 前言一、项目目录结构二、组件化开发1. 组件化2. Vue 组件的基本结构3. 依赖包less & less-loader 前言 组件化开发是Vue.js的核心理念之一&#xff0c;Vue CLI为开发者提…...

Ubuntu: 配置OpenCV环境

从从Ubuntu系统安装opencv_ubuntu安装opencv-CSDN博客文章浏览阅读2.3k次&#xff0c;点赞4次&#xff0c;收藏14次。开源计算机视觉(OpenCV)是一个主要针对实时计算机视觉的编程函数库。OpenCV的应用领域包括:2D和3D功能工具包、运动估计、面部识别系统、手势识别、人机交互、…...

芯片解决方案--SL8541e-OpenHarmony适配方案

摘要 本文描述8541E芯片适配OpenHarmony的整体方案。 本文描述的整体方案&#xff0c;不止适用于8541e&#xff0c;也适用于该芯片厂家的其他芯片&#xff0c;如7863、7885&#xff0c;少部分子系统会略有差异。 整体方案架构 整体方案架构如下图&#xff0c;遵循OpenHarmo…...

Spring Boot之数据访问集成入门

Spring Boot中的数据访问和集成支持功能是其核心功能之一&#xff0c;通过提供大量的自动配置和依赖管理&#xff0c;极大地简化了数据访问层的开发。Spring Boot支持多种数据库&#xff0c;包括关系型数据库&#xff08;如MySQL、Oracle等&#xff09;和非关系型数据库&#x…...

Learn ComputeShader 09 Night version lenses

这次将要制作一个类似夜视仪的效果 第一步就是要降低图像的分辨率&#xff0c; 这只需要将id.xy除上一个数字然后再乘上这个数字 可以根据下图理解&#xff0c;很明显通过这个操作在多个像素显示了相同的颜色&#xff0c;并且很多像素颜色被丢失了&#xff0c;自然就会有降低分…...

Java学习第七天

成员方法分类&#xff1a; 静态成员方法&#xff08;有static修饰 属于类&#xff09;建议用类名访问&#xff0c;也可以用对象访问 实例成员方法&#xff08;无static修饰 属于对象&#xff09;只能用对象出发访问 使用static来定义一些工具类 工具类直接使用类名.方法调用即…...

深入剖析 Redis 基础及其在 Java 应用中的实战演练

引言 在现代分布式系统和高并发应用中&#xff0c;缓存系统是不可或缺的一环&#xff0c;而 Redis 作为一种高性能的内存数据存储以其丰富的数据结构和快速的读写性能&#xff0c;成为了众多开发者的首选。本篇博客将详细介绍 Redis 的基础知识&#xff0c;并通过 Java 代码演…...

Why I‘m getting 404 Resource Not Found to my newly Azure OpenAI deployment?

题意&#xff1a;为什么我新部署的Azure OpenAI服务会出现404资源未找到的错误&#xff1f; 问题背景&#xff1a; Ive gone through this quickstart and I created my Azure OpenAI resource created a model deployment which is in state succeedded. I also playaround …...

【word导出带图片】使用docxtemplater导出word,通知书形式的word

一、demo-导出的的 二、代码操作 1、页面呈现 项目要求&#xff0c;所以页面和导出来的word模版一致 2、js代码【直接展示点击导出的js代码】 使用插件【先下载这五个插件&#xff0c;然后页面引入插件】 import docxtemplater from docxtemplater import PizZip from pizzip …...

微信小程序路由跳转之间的区别

navigateTo&#xff1a; 功能描述&#xff1a; navigateTo用于保留当前页面&#xff0c;跳转到应用内的某个页面。但是不能跳到 tabbar 页面。 页面栈变化&#xff1a; 当使用navigateTo进行页面跳转时&#xff0c;当前页面会被推入页面栈中&#xff0c;但不会被销毁&#xff0…...

centos安装docker并配置加速器

docker安装与卸载&#xff1a; 1、检查当前是否安装docker yum list installed | grep docker2、卸载docker 根据yum list installed | grep docker查询出来的内容&#xff0c;逐个进行删除 yum remove docker.x86 64 -y3、启动与关闭docker 4、删除/etc/docker文件夹 如果…...

【软件测试】设计测试用例

目录 &#x1f4d5;引言 &#x1f340;测试用例 &#x1f6a9;概念 &#x1f6a9;设计测试用例的万能公式 &#x1f3c0;常规思考逆向思维发散性思维 &#x1f3c0;万能公式 &#x1f384;设计测试用例的方法 &#x1f6a9;基于需求的设计方法 &#x1f3c0;明确需求中…...

Kafka【十三】消费者消费消息的偏移量

偏移量offset是消费者消费数据的一个非常重要的属性。默认情况下&#xff0c;消费者如果不指定消费主题数据的偏移量&#xff0c;那么消费者启动消费时&#xff0c;无论当前主题之前存储了多少历史数据&#xff0c;消费者只能从连接成功后当前主题最新的数据偏移位置读取&#…...

Python 的语法元素(容易忘记的)

文章目录 同步赋值同步赋值的相关操作同步赋值的原理 同步赋值 同步赋值是 Python 语言的一个强大功能&#xff0c;它让代码更加紧凑和高效&#xff0c;尤其是在处理多个变量时。 同步赋值的相关操作 简单同步赋值&#xff1a; 如果你想同时初始化多个变量到不同的值&#x…...

找到字符串中所有字母异位词问题

欢迎跳转我的主页&#xff1a;羑悻的小杀马特-CSDN博客 目录&#xff1a; 一题目简述&#xff1a; 二思路汇总&#xff1a; 三解答代码&#xff1a; 一题目简述&#xff1a; leetcode题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二思路汇总&#xff1a; …...

GLM-4-9B-Chat-1M镜像升级路径:从GLM-4-9B-Chat到1M版本的权重转换与验证

GLM-4-9B-Chat-1M镜像升级路径&#xff1a;从GLM-4-9B-Chat到1M版本的权重转换与验证 如果你正在使用GLM-4-9B-Chat模型&#xff0c;并且被它128K的上下文长度所吸引&#xff0c;那么现在有个好消息&#xff1a;它的“超级加强版”来了。GLM-4-9B-Chat-1M版本&#xff0c;直接…...

终极指南:5步彻底解决显卡驱动残留问题

终极指南&#xff1a;5步彻底解决显卡驱动残留问题 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstaller 你是否曾经…...

Z-Image-Turbo_Sugar脸部Lora生成图像的后处理技巧:使用PS软件进行精修

Z-Image-Turbo_Sugar脸部Lora生成图像的后处理技巧&#xff1a;使用PS软件进行精修 AI生成图像&#xff0c;尤其是像Z-Image-Turbo_Sugar这类擅长生成甜美、精致人像的模型&#xff0c;已经能产出相当惊艳的初稿。但如果你仔细观察&#xff0c;会发现这些图片距离真正“完美”…...

RexUniNLU模型多任务学习原理与实战

RexUniNLU模型多任务学习原理与实战 1. 引言 你是否曾经遇到过这样的困扰&#xff1a;在处理自然语言理解任务时&#xff0c;需要为命名实体识别、关系抽取、文本分类等不同任务分别训练和维护多个模型&#xff1f;这不仅增加了开发成本&#xff0c;还让系统变得复杂难维护。…...

EcomGPT-7B电商大模型网络安全应用:智能识别钓鱼商品与欺诈文案

EcomGPT-7B电商大模型网络安全应用&#xff1a;智能识别钓鱼商品与欺诈文案 最近和几个做电商平台的朋友聊天&#xff0c;他们都在头疼同一个问题&#xff1a;平台上的商品和文案越来越“花”&#xff0c;有些商家为了引流&#xff0c;标题和描述写得天花乱坠&#xff0c;甚至…...

nuScenes 3D标注数据深度解析:从Box字段到可视化,理解自动驾驶感知的基石

nuScenes 3D标注数据深度解析&#xff1a;从Box字段到可视化&#xff0c;理解自动驾驶感知的基石 自动驾驶技术的快速发展离不开高质量数据集的支撑&#xff0c;而nuScenes作为业界公认的标杆级数据集&#xff0c;其丰富的3D标注信息为感知算法研发提供了坚实基础。本文将带您深…...

Qwen3-Reranker-0.6B实战案例:跨语言技术文档智能筛选系统

Qwen3-Reranker-0.6B实战案例&#xff1a;跨语言技术文档智能筛选系统 1. 引言&#xff1a;技术文档管理的痛点与解决方案 在全球化技术团队协作中&#xff0c;工程师们经常面临这样的困境&#xff1a;当需要查找某个技术问题的解决方案时&#xff0c;面对的是分散在Confluen…...

市场知名的光伏项目品牌找哪家

这两年不少做企业的、建农村自建房的业主都盯上了光伏项目——发了电自己用&#xff0c;余电还能卖&#xff0c;长期收益稳定&#xff0c;不少人靠着光伏每年多赚几万甚至几十万。但我接触过至少几十个踩坑的业主&#xff1a;要么找了小品牌装完就跑路&#xff0c;发电量比承诺…...

OpenClaw飞书机器人实战:千问3.5-9B自动回复消息

OpenClaw飞书机器人实战&#xff1a;千问3.5-9B自动回复消息 1. 为什么选择OpenClaw飞书千问3.5-9B组合&#xff1f; 去年底我开始尝试用AI自动化处理团队沟通需求时&#xff0c;发现市面上大多数方案要么需要将数据上传到第三方平台&#xff0c;要么配置复杂得让人望而却步。…...

【数据结构】二叉树非递归前中后序遍历详解

二叉树的遍历是二叉树操作的基础核心&#xff0c;递归遍历实现简单但存在栈溢出风险&#xff0c;在处理深度较大的二叉树时&#xff0c;非递归遍历凭借手动维护栈的方式更具稳定性。本文将详细讲解二叉树前序、中序、后序的非递归遍历实现思路&#xff0c;结合 C 语言代码完整实…...