当前位置: 首页 > article >正文

【SpringBoot中MySQL生成唯一ID的常见方法】

SpringBoot中MySQL生成唯一ID的常见方法

在Spring Boot中,为MySQL生成唯一ID有多种方式,每种方式都有其特定的概念、优越点和使用场景。以下是详细的说明和代码示例:

UUID

概念: UUID(Universally Unique Identifier)是一种通过特定算法生成的128位长的数字,用于确保全局唯一性。

优越点:

  • 全局唯一性。
  • 不依赖于数据库。

使用场景: 需要高度唯一性且对性能要求不高的场景。

代码示例:

import java.util.UUID;

public class UUIDGenerator {
    public static String generateUUID() {
        return UUID.randomUUID().toString();
    }
}

数据库自增

概念: 使用数据库的自增特性生成ID。

优越点:

  • 简单、高效。
  • 数据库保证唯一性。

使用场景: 简单的CRUD操作,对ID生成要求不高的场景。

代码示例:

@Entity
public class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    // 其他字段
}

Redis生成ID

概念: 利用Redis的原子操作生成ID。

优越点:

  • 分布式环境下的唯一性。
  • 高性能。

使用场景: 分布式系统中需要唯一ID的场景。

代码示例:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class RedisIdGenerator {

    private static final String KEY = "id:generator";

    @Autowired
    private StringRedisTemplate redisTemplate;

    public long generateId() {
        return redisTemplate.opsForValue().increment(KEY);
    }
}

Zookeeper生成ID

概念: 利用Zookeeper的顺序节点特性生成唯一ID。

优越点:

  • 分布式环境下的唯一性。
  • 可靠性高。

使用场景: 对唯一性和可靠性要求高的分布式系统。

代码示例:
由于Zookeeper的实现相对复杂,这里提供一个简单的思路:

  1. 创建一个顺序节点。
  2. 获取节点的顺序值作为ID。

雪花算法(Snowflake)

概念: Twitter开源的分布式ID生成算法,基于时间戳生成64位的唯一ID。

优越点:

  • 全局唯一性。
  • 有序性。
  • 高性能。

使用场景: 分布式系统中需要全局唯一且有序的ID。

代码示例:
可以使用第三方库,如 Hutool:

import cn.hutool.core.lang.Snowflake;

public class SnowflakeIdGenerator {
    private static final Snowflake snowflake = new Snowflake(1, 1, 1);

    public static long generateId() {
        return snowflake.nextId();
    }
}

Leaf算法

概念: 由美团开源的分布式ID生成算法,基于Segment和Snowflake思想。

优越点:

  • 高性能。
  • 低延迟。

使用场景: 高并发分布式系统。

代码示例:
Leaf算法的实现相对复杂,通常使用官方提供的服务或SDK。

UID-generator

概念: 由百度开源的分布式唯一ID生成器,基于Twitter的Snowflake算法。

优越点:

  • 分布式唯一性。
  • 可配置性。

使用场景: 分布式系统中需要唯一ID的场景。

代码示例:
可以使用官方提供的服务或SDK。

数据库序列(Sequence)

概念: 使用数据库提供的序列对象生成唯一ID。

优越点:

  • 数据库保证唯一性。
  • 适用于支持序列的数据库。

使用场景: 需要在数据库中生成唯一ID的场景。

代码示例:

@Entity
public class MyEntity {
    @Id
    @SequenceGenerator(name = "my_sequence", sequenceName = "my_sequence", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_sequence")
    private Long id;
    // 其他字段
}

使用Hibernate的@SequenceGenerator

概念: Hibernate提供的序列生成器。

优越点:

  • 与Hibernate集成良好。
  • 适用于支持序列的数据库。

使用场景: Hibernate ORM框架中的唯一ID生成。

代码示例:
与上面数据库序列的代码示例相同。

使用@GeneratedValue(strategy = GenerationType.SEQUENCE)

概念: JPA标准中提供的序列生成策略。

优越点:

  • 标准化。
  • 适用于支持序列的数据库。

使用场景: JPA实体中的唯一ID生成。

代码示例:
与上面数据库序列的代码示例相同。

使用第三方库(如MyBatis Plus)

概念: MyBatis Plus提供的ID生成策略,包括UUID、自增、雪花算法等。

优越点:

  • 集成方便。
  • 支持多种策略。

使用场景: MyBatis Plus ORM框架中的唯一ID生成。

代码示例:
在配置文件中指定ID生成策略:

mybatis-plus:
  global-config:
    db-config:
      id-type: ASSIGN_ID  # 使用雪花算法

或在实体类上指定:

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;

public class MyEntity {
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    // 其他字段
}

这些方式各有优缺点,具体选择哪种方式取决于你的项目需求和技术栈。


http://www.kler.cn/a/442955.html

相关文章:

  • DeepSeek:性能强劲的开源模型
  • Python的循环
  • 服务器运行Vue项目
  • /:087启动游戏时提示丢失”d3dx···.dll””VCOMP···.dll”
  • React 第十七节 useMemo用法详解
  • [NOIP2016 普及组] 海港 -STL-队列queue
  • 剑指Offer|LCR 002. 二进制求和
  • vue3+ant design vue实现日期选择器不展示清除按钮
  • java微服务中,对分布式锁、分布式事务处理建议
  • 什么是3DEXPERIENCE SOLIDWORKS,它有哪些角色和功能?
  • CRMEB PHP多商户版DOCKER部署实战
  • JAVA没有搞头了吗?
  • 【AI日记】24.12.17 kaggle 比赛 2-6 | 把做饭看成一种游戏 | 咖喱牛肉
  • flask_socketio 以继承 Namespace方式实现一个网页聊天应用
  • 爬虫案例学习6
  • 从〇开始深度学习(番外)——混淆矩阵(Confusion Matrix)
  • LeetCode 热题 100_两数相加(28_2_中等_C++)(单链表)
  • 大模型运用-Prompt Engineering(提示工程)
  • Deveco Studio首次编译项目初始化失败
  • 3D 生成重建038-DiffGS训练一个3DGS编码器来简化训练
  • 1 JVM JDK JRE之间的区别以及使用字节码的好处
  • [搜广推] 王树森推荐算法——概要