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

本文主要讲解关于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。mybatis-plus id在高并发下出现重复

解决方案

解决思路是,只要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在高并发下出现重复相关的全部内容,希望对你有帮助。欢迎持续关注程序员导航网,学习愉快哦!

版权声明:cnblogshot 发表于 2024-05-19 12:25:19。
转载请注明:mybatis-plus id在高并发下出现重复 | 程序员导航网

暂无评论

暂无评论...