分布式项目中使用雪花算法提前获取对象主键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.yml 或 application.properties 中正确设置:
mybatis-plus:global-config:db-config:id-type: auto
这样,当你创建 MyEntity 实例时,IdGenerator 会使用雪花算法生成唯一的主键ID。然后,你可以将实体对象插入到数据库中,主键ID将在对象创建时就被设置好。
下面我们介绍一下雪花算法使用的原理:
雪花算法原理
雪花算法生成唯一自增ID的原理主要依赖于以下几个方面:
-
时间戳:雪花算法的ID包含一个时间戳部分,表示当前时间。这个时间戳部分是自定义的,从一个固定的时间点开始计数(通常是系统启动时间或某个纪元),可以精确到毫秒级别。这使得ID在同一毫秒内生成的多个ID不会重复。
-
机器ID:雪花算法还包括机器ID(数据中心ID和工作机器ID)。这保证了在分布式系统中,不同的机器生成的ID不会冲突。通过将机器ID嵌入到生成的ID中,每台机器生成的ID都具有唯一性。
-
序列号:在同一毫秒内生成多个ID时,雪花算法会使用序列号来区分这些ID。序列号是自增的,可以在同一毫秒内生成多个唯一的ID。
-
位移:生成的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,大家好,我是灰小猿! 在做分布式项目开发进行数据表结构设计时,有时候为了提高查询性能,在进行数据库表设计时,会使用自增ID来代替UUID作为数据的主键ID,但是这样就会有一个问题ÿ…...
小程序多个set-cookie无法处理
1、情景: 项目中遇到一个问题,客户的服务器上了华为云的防火墙,导致小程序请求头中携带了3个set- cookie(有两个是华为云给自动加的),而小程序端不知道用哪个来 处理,结果选了个错误的进行处理…...
Mybatis【分页插件,缓存,一级缓存,二级缓存,常见缓存面试题】
文章目录 MyBatis缓存分页延迟加载和立即加载什么是立即加载?什么是延迟加载?延迟加载/懒加载的配置 缓存什么是缓存?缓存的术语什么是MyBatis 缓存?缓存的适用性缓存的分类一级缓存引入案例一级缓存的配置一级缓存的工作流程一级…...
【Qt开发】QT6.5.3安装方法(使用国内源)亲测可行!!!
目录 🌕下载在线安装包🌕 把安装包放到系统盘🌕开始安装🌕参考文章 🌕下载在线安装包 https://mirrors.nju.edu.cn/qt/official_releases/online_installers/ 🌕 把安装包放到系统盘 我的系统盘是G盘&…...
springblade-JWT认证缺陷漏洞CVE-2021-44910
漏洞成因 SpringBlade前端通过webpack打包发布的,可以从其中找到app.js获取大量接口 然后直接访问接口:api/blade-log/api/list 直接搜索“请求未授权”,定位到认证文件:springblade/gateway/filter/AuthFilter.java 后面的代码…...
Chapter 12 Vue CLI脚手架组件化开发
欢迎大家订阅【Vue2Vue3】入门到实践 专栏,开启你的 Vue 学习之旅! 文章目录 前言一、项目目录结构二、组件化开发1. 组件化2. Vue 组件的基本结构3. 依赖包less & less-loader 前言 组件化开发是Vue.js的核心理念之一,Vue CLI为开发者提…...
Ubuntu: 配置OpenCV环境
从从Ubuntu系统安装opencv_ubuntu安装opencv-CSDN博客文章浏览阅读2.3k次,点赞4次,收藏14次。开源计算机视觉(OpenCV)是一个主要针对实时计算机视觉的编程函数库。OpenCV的应用领域包括:2D和3D功能工具包、运动估计、面部识别系统、手势识别、人机交互、…...
芯片解决方案--SL8541e-OpenHarmony适配方案
摘要 本文描述8541E芯片适配OpenHarmony的整体方案。 本文描述的整体方案,不止适用于8541e,也适用于该芯片厂家的其他芯片,如7863、7885,少部分子系统会略有差异。 整体方案架构 整体方案架构如下图,遵循OpenHarmo…...
Spring Boot之数据访问集成入门
Spring Boot中的数据访问和集成支持功能是其核心功能之一,通过提供大量的自动配置和依赖管理,极大地简化了数据访问层的开发。Spring Boot支持多种数据库,包括关系型数据库(如MySQL、Oracle等)和非关系型数据库&#x…...
Learn ComputeShader 09 Night version lenses
这次将要制作一个类似夜视仪的效果 第一步就是要降低图像的分辨率, 这只需要将id.xy除上一个数字然后再乘上这个数字 可以根据下图理解,很明显通过这个操作在多个像素显示了相同的颜色,并且很多像素颜色被丢失了,自然就会有降低分…...
Java学习第七天
成员方法分类: 静态成员方法(有static修饰 属于类)建议用类名访问,也可以用对象访问 实例成员方法(无static修饰 属于对象)只能用对象出发访问 使用static来定义一些工具类 工具类直接使用类名.方法调用即…...
深入剖析 Redis 基础及其在 Java 应用中的实战演练
引言 在现代分布式系统和高并发应用中,缓存系统是不可或缺的一环,而 Redis 作为一种高性能的内存数据存储以其丰富的数据结构和快速的读写性能,成为了众多开发者的首选。本篇博客将详细介绍 Redis 的基础知识,并通过 Java 代码演…...
Why I‘m getting 404 Resource Not Found to my newly Azure OpenAI deployment?
题意:为什么我新部署的Azure OpenAI服务会出现404资源未找到的错误? 问题背景: 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、页面呈现 项目要求,所以页面和导出来的word模版一致 2、js代码【直接展示点击导出的js代码】 使用插件【先下载这五个插件,然后页面引入插件】 import docxtemplater from docxtemplater import PizZip from pizzip …...
微信小程序路由跳转之间的区别
navigateTo: 功能描述: navigateTo用于保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。 页面栈变化: 当使用navigateTo进行页面跳转时,当前页面会被推入页面栈中,但不会被销毁࿰…...
centos安装docker并配置加速器
docker安装与卸载: 1、检查当前是否安装docker yum list installed | grep docker2、卸载docker 根据yum list installed | grep docker查询出来的内容,逐个进行删除 yum remove docker.x86 64 -y3、启动与关闭docker 4、删除/etc/docker文件夹 如果…...
【软件测试】设计测试用例
目录 📕引言 🍀测试用例 🚩概念 🚩设计测试用例的万能公式 🏀常规思考逆向思维发散性思维 🏀万能公式 🎄设计测试用例的方法 🚩基于需求的设计方法 🏀明确需求中…...
Kafka【十三】消费者消费消息的偏移量
偏移量offset是消费者消费数据的一个非常重要的属性。默认情况下,消费者如果不指定消费主题数据的偏移量,那么消费者启动消费时,无论当前主题之前存储了多少历史数据,消费者只能从连接成功后当前主题最新的数据偏移位置读取&#…...
Python 的语法元素(容易忘记的)
文章目录 同步赋值同步赋值的相关操作同步赋值的原理 同步赋值 同步赋值是 Python 语言的一个强大功能,它让代码更加紧凑和高效,尤其是在处理多个变量时。 同步赋值的相关操作 简单同步赋值: 如果你想同时初始化多个变量到不同的值&#x…...
找到字符串中所有字母异位词问题
欢迎跳转我的主页:羑悻的小杀马特-CSDN博客 目录: 一题目简述: 二思路汇总: 三解答代码: 一题目简述: leetcode题目链接:. - 力扣(LeetCode) 二思路汇总: …...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
