mybatis-plus id在高并发下出现重复
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。

解决方案
解决思路是,只要workid,datacenterid中组合确保在所有节点中唯一就解决问题。
下面选用了redis的自增值解决,当然也可以使用zookeeper、mysql等等,从已有的组件中选就好
com.baomidou.mybatisplus.core.toolkit.Sequence#getMaxWorkerId
/**
* 通过redis自增初始化的snowflake
*/
@Component
public class SnowflakeUtil {
private volatile Snowflake snowflake;
@Resource
private 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;
}
@Override
public Number nextId(Object entity) {
return snowflakeUtil.nextId();
}
}
mybatis-plus id在高并发下出现重复的更多相关文章
- 【mysql】mysql增加version字段实现乐观锁,实现高并发下的订单库存的并发控制,通过开启多线程同时处理模拟多个请求同时到达的情况 + 同一事务中使用多个乐观锁的情况处理
mysql增加version字段实现乐观锁,实现高并发下的订单库存的并发控制,通过开启多线程同时处理模拟多个请求同时到达的情况 ==================================== ...
- php结合redis实现高并发下的抢购、秒杀功能
抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个:1 高并发对数据库产生的压力2 竞争状态下如何解决库存的正确减少("超卖"问题)对于第一个问题,已经很容易想到用缓存 ...
- EF+MySQL乐观锁控制电商并发下单扣减库存,在高并发下的问题
下订单减库存的方式 现在,连农村的大姐都会用手机上淘宝购物了,相信电商对大家已经非常熟悉了,如果熟悉电商开发的同学,就知道在买家下单购买商品的时候,是需要扣减库存的,当然有2种扣减库存的方式, 一种是 ...
- PHP开发中多种方案实现高并发下的抢购、秒杀功能
抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少("超卖"问题) 对于第一个问题,已经很容易想到 ...
- redis实现高并发下的抢购/秒杀功能
之前写过一篇文章,高并发的解决思路(点此进入查看),今天再次抽空整理下实际场景中的具体代码逻辑实现吧:抢购/秒杀是如今很常见的一个应用场景,那么高并发竞争下如何解决超抢(或超卖库存不足为负数的问题)呢 ...
- 分布式高并发下Actor模型
分布式高并发下Actor模型 写在开始 一般来说有两种策略用来在并发线程中进行通信:共享数据和消息传递.使用共享数据方式的并发编程面临的最大的一个问题就是数据条件竞争.处理各种锁的问题是让人十分头痛的 ...
- php 结合redis实现高并发下的抢购、秒杀功能
抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个:1 高并发对数据库产生的压力2 竞争状态下如何解决库存的正确减少("超卖"问题)对于第一个问题,已经很容易想到用缓存 ...
- [Redis] - 高并发下Redis缓存穿透解决
高并发情况下,可能都要访问数据库,因为同时访问的方法,这时需要加入同步锁,当其中一个缓存获取后,其它的就要通过缓存获取数据. 方法一: 在方法上加上同步锁 synchronized //加同步锁,解决 ...
- 高并发下,php与redis实现的抢购、秒杀功能
抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少("超卖"问题) 对于第一个问题,已经很容易想到 ...
- php结合redis实现高并发下的抢购、秒杀功能【转】
抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个:1 高并发对数据库产生的压力2 竞争状态下如何解决库存的正确减少("超卖"问题)对于第一个问题,已经很容易想到用缓存 ...
随机推荐
- C 语言指针完全指南:创建、解除引用、指针与数组关系解析
C 语言中的指针 创建指针 我们可以使用引用运算符 & 获取变量的内存地址: int myAge = 43; // 一个 int 变量 printf("%d", myAge ...
- Windows cmd命令 -- 记录
# 清屏 >> cls # 查看进程 >> tasklist # 结束进程 >> tskill <pid> # 查询WIFI列表所有WIFI的信息 &g ...
- Redis之父萨尔瓦多·桑菲利波又名安蒂雷斯
萨尔瓦多·桑菲利波又名安蒂雷斯 个人博客连接 嗨,我是萨尔瓦多·桑菲利波,也被称为安提雷斯, 一位居住在卡塔尼亚的意大利计算机程序员. 我于7年1977月2020日出生在坎波贝洛迪利卡塔. 2022 ...
- MogDB 使用样本数据集Mogila
MogDB 使用样本数据集 Mogila MogDB 提供了一个样本数据集 Mogila,本数据集借鉴了适用于 MySQL 的Sakila 示例数据库.Sakila最初由 MySQL AB 文档团队的 ...
- 基于HarmonyOS的HTTPS请求过程开发示例(ArkTS)
介绍 本篇Codelab基于网络模块以及Webview实现一次HTTPS请求,并对其过程进行抓包分析.效果如图所示: 相关概念 ● Webview:提供Web控制能力,Web组件提供网页显示能力. ...
- 报表工具能用来做 DashBoard 和大屏吗?
我们首先来理一下 DashBoard.大屏和报表的关系. DashBoard 是指企业仪表盘,也叫管理者驾驶舱,通常被简称为 DBD.从表现形式上来看,DBD 由多个决策者关注的各类指标数据拼接而成, ...
- mysql 必知必会整理—视图[十二]
前言 简单整理一下视图. 正文 视图: 需要MySQL 5 MySQL 5添加了对视图的支持.因此,本章内容适用于MySQL 5及以后的版本. 视图是虚拟的表.与包含数据的表不一样,视图只包含使用时动 ...
- Tkinter常用功能示例(一)
技术背景 Tkinter是一个Python自带的GUI框架,虽然现在主流的还是用pyqt的多一些,但是Tkinter在环境配置上可以节省很多工作,可以用来做一些小项目.如果是大型项目,用pyqt或者Q ...
- 《Effective C#》系列之(五)——优化集合的使用
一.优化集合的使用 在<Effective C#>这本书中,优化集合的使用是其中一章的内容.以下是该章节的一些核心建议,以及使用C#代码示例说明: 使用泛型集合:泛型集合可以避免装箱和拆箱 ...
- 《c#高级编程》第3章C#3.0中的更改(五)——扩展方法
C#扩展方法是一种语法,可以为已有的类添加新的实例方法,而无需修改原来的类定义.它的语法形式为: ```csharppublic static void MyExtensionMethod(this ...