MyBatis-Plus中的ASSIGN_ID生成问题及解决方案
时间:2024-05-17 18:49:41来源:Lwgzc手游网作者:佚名我要评论 用手机看
扫描二维码随身看资讯
使用手机 二维码应用 扫描右侧二维码,您可以
1. 在手机上细细品读~
2. 分享给您的微信好友或朋友圈~
id生成策略在分布式高并发环境下可能出现重复id的问题。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等等,从已有的组件中选就好。具体实现代码如下:
/**
* 通过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();
}
}
热门手游下载
热门文章
热门手游推荐
换一批
- 1
加查之花 正版
- 2
爪女孩 最新版
- 3
企鹅岛 官方正版中文版
- 4
捕鱼大世界 无限金币版
- 5
情商天花板 2024最新版
- 6
球球英雄 手游
- 7
内蒙打大a真人版
- 8
烦人的村民 手机版
- 9
跳跃之王手游
- 10
蛋仔派对 国服版本