mybatis-plus id在高并发下出现重复

news/2024/11/19 11:24:29/文章来源:https://www.cnblogs.com/zmj-pr/p/16856864.html

mybaits-plus ASSIGN_ID生成

id生成策略 在分布式高并发环境下出现重复id https://github.com/baomidou/mybatis-plus/issues/3077
mybatis-plus 对@TableId(type = IdType.ASSIGN_ID)生成默认使用com.baomidou.mybatisplus.core.toolkit.Sequence,这个类是雪花算法的实现,在该实现中workid,datacenterid是根据网卡硬件地址生成,而部署在docker容器内的应用读取不到宿主机的硬件地址

什么是雪花算法

雪花算法是Twitter开源的一种全局唯一ID生成算法,它可以生成一个64位的整数ID。在雪花算法中,workerid是一个重要的参数,用于标识不同的机器。需要保证在不同的机器之间是唯一的,通常可以通过MAC地址或者IP地址来生成workerid。
image

解决方案

解决思路是,只要workid,datacenterid中组合确保在所有节点中唯一就解决问题。
下面选用了redis的自增值解决,当然也可以使用zookeeper、mysql等等,从已有的组件中选就好
com.baomidou.mybatisplus.core.toolkit.Sequence#getMaxWorkerId

/**
*  通过redis自增初始化的snowflake
*/
@Component
public class SnowflakeUtil {private volatile Snowflake snowflake;@Resourceprivate RedissonClient redissonClient;public long nextId() {return getSnowflake().nextId();}public String nextIdStr() {return String.valueOf(nextId());}public Snowflake getSnowflake() {if (snowflake == null) {synchronized (SnowflakeUtil.class) {if (snowflake == null) {long workId = redissonClient.getAtomicLong("snowflake:worker").getAndIncrement();snowflake = IdUtil.createSnowflake(workId % 32, 1);}}}return snowflake;}}/**
* 替换mybatis-plus ASSIGN_ID的生成器
*/
@Component
public class IdGenerator implements IdentifierGenerator {private final SnowflakeUtil snowflakeUtil;public IdGenerator(SnowflakeUtil snowflakeUtil) {this.snowflakeUtil = snowflakeUtil;}@Overridepublic Number nextId(Object entity) {return snowflakeUtil.nextId();}
}

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

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

相关文章

铁威马硬盘柜D4-320:超越网盘,让数据存储更自由

时至今日,我们越来越依赖数字数据来记录生活的点滴和工作的成果。然而,随着数据的不断累积,我们时常会遇到一个问题:网盘空间不够用。此外,网盘的安全性也是我们关注的焦点,一旦网盘服务商出现问题或数据泄露,我们的宝贵数据就可能面临丢失的风险。因此,寻找一个可靠的…

iOS获取.ips文件并通过Xcode自带的symbolicatecrash解析

文章讲述如下问题: 1. 如何获取.ips文件 2.如何获取symbolicatecrash 3.解析前的准备工作 4.如何将.ips转为.crash文件 5.如何使用symbolicatecrash解析.crash文件 6.异常错误处理1.如何获取.ips文件? 在 iOS 中,你可以通过几种方式找到应用程序的 .ips 文件,具体取决于你是…

使用达梦客户端工具对存储过程调试

找到存储过程,右键》调试》在新的调试编辑器调试打开界面如下:下面有个初始变量,输入所需要的参数 也可以直接在存储过程写入参数P_DEMO(1001)这种参数输入好之后,点右上角绿色三角箭头开始调试选择下面的进入按钮对存储过程内部进行调试进入之后,界面如下,这样就可以选择…

AD导入DXF画板框结构

一、安装导入DXF插件 1. 确定当前软件是否支持导入DXF a. 在PCB编辑窗口下,依次选择 file > import…b. 在import file窗口下查看文件后缀名下拉菜单是否有DXF,我这里是有的。如果没有需要下载DXF插件; 二、导入DXF结构文件至此DXF文件已成功导入PCB。三、根据DXF画板框 …

Activiti 7 BPMN文件中的assignee 失效

问题描述 最近正在学习springboot 集成 activiti7,看网上好多帖子都推荐的流程设计器是Camunda Modeler,所以也下载了一个,并且流程部署、启动、完成等步骤都正常。 可当我准备开始指派任务时,却发现数据表act_ru_task中的ASSIGNEE_字段始终为空。解决方案 本质:activiti …

.net Swagger

一、swagger使用 1.打开Nuget,搜索安装Swashbuckle.AspNetCore。 2.生成api文档 3.Program.cs 添加如下代码 FreightForwarderApi.xml 替换成你的。var basePath = AppContext.BaseDirectory;builder.Services.AddSwaggerGen(c => {c.SwaggerDoc("v1", new Open…

基于java处理一些有规律的字符串

根据相同的符号进行分割的字符串转为list数组String reviewerOaGroup = "张三,李四,王五";//使用三元运算符如果reviewerOaGroup包含某个字符则根据该字符进行分割然后把每一项放入list中,如果不含有该字符则直接把该字符串放入listList<String> reviewerOaGr…

VSCode添加自定义的Vue3.2标准模板

详细步骤参考:VSCode添加自定义的Vue3.2标准模板VueJs.json 在Vscode 中的模版{"生成vue模版" :{"prefix": "vue","body": ["vm = new Vue({"," el: #,"," /* 数据对象:数据赋值声明 */","…

SpringCloud解决feign调用token丢失问题

背景讨论 feign请求 在微服务环境中,完成一个http请求,经常需要调用其他好几个服务才可以完成其功能,这种情况非常普遍,无法避免。那么就需要服务之间的通过feignClient发起请求,获取需要的 资源。 认证和鉴权 一般而言,微服务项目部署环境中,各个微服务都是运行在内网环…

揭秘Linux find命令:高效查找文件的终极指南,让你秒变文件搜索达人!

Linux中find命令的详细使用指南:高效查找文件的秘诀Linux中find命令的详细使用指南:高效查找文件的秘诀 在Linux系统中,find命令是一个强大的工具,它允许你在文件系统中搜索特定的文件或目录。无论你是系统管理员还是普通用户,掌握find命令都能极大地提升你在Linux环境下的…

PVE导入VMware虚拟机

1、在VMware中导出需要迁移的虚拟机,导出为 OVF 2、将导出的虚拟机上传到PVE中,共三个文件 3、命令导入到PVE虚拟机中,等待导入完成qm importovf 103 Ubuntu Server 20.04.ovf disk1 --format qcow2 #103为新建的虚拟机id,不要和现有的重复,disk1为PVE中的磁盘路…

我开源了一款高颜值云端一体的项目。欢迎体验!!!

项目介绍 旅拍路书:旅行爱好者的专属记录伙伴,基于uniCloud + vue3的全栈项目,包括用户登录,更新个人信息,富文本编辑,分类管理以及AI助手等功能的高颜值项目。 预览 h5端扫码预览: 小程序扫码预览: 微信小程序提交审核未通过(你的小程序涉及用户自行生成内容(文字、…