首页 >java编程 >Java自增ID实现

Java自增ID实现

来源:www.hellomonster.net 时间:2024-05-13 11:27:28 作者:第一编程网 浏览: [手机版]

在Java中,自增ID是一种常见的实现方式,它可以用于各种不同的场景,例如生成单号、用ID、商品ID等等第一编程网www.hellomonster.net。本文将介绍Java自增ID的实现方式,包括使用数据库自增ID、使用Redis自增ID、使用Snowflake算法自增ID等。

Java自增ID实现(1)

使用数据库自增ID

  使用数据库自增ID是最常见的实现方式一,它的原理是在数据库中创建一个自增ID字段,每次插入一条记时,数据库会自动为该记分配一个唯一的IDhellomonster.net。使用数据库自增ID的优点是实现简单、易于维护,缺点是需要频繁访问数据库,可能会影响性能。

  下面是使用MySQL数据库自增ID的示例代码:

```java

public class OrderDao {

private static final String INSERT_SQL = "INSERT INTO orders (order_no, user_id, amount) VALUES (?, ?, ?)";

  private static final String SELECT_LAST_INSERT_ID_SQL = "SELECT LAST_INSERT_ID()";

  private DataSource dataSource;

public OrderDao(DataSource dataSource) {

this.dataSource = dataSource;

  }

public long createOrder(Order order) throws SQLException {

  Connection conn = dataSource.getConnection();

  PreparedStatement ps = conn.prepareStatement(INSERT_SQL);

  ps.setString(1, order.getOrderNo());

  ps.setLong(2, order.getUserId());

ps.setBigDecimal(3, order.getAmount());

ps.executeUpdate();

  ps.close();

  ps = conn.prepareStatement(SELECT_LAST_INSERT_ID_SQL);

  ResultSet rs = ps.executeQuery();

long orderId = 0;

  if (rs.next()) {

orderId = rs.getLong(1);

}

rs.close();

  ps.close();

Java自增ID实现(2)

conn.close();

  return orderId;

}

}

```

使用Redis自增ID

  使用Redis自增ID的原理是利用Redis的原子操作incr实现自增第一编程网。每次获取ID时,调用incr命令将ID自增1,然后返回自增后的值。使用Redis自增ID的优点是速度、可靠性高,缺点是需要依赖Redis,如果Redis出现故,会影响整个系统的正常运行第 一 编 程 网

下面是使用Redis自增ID的示例代码:

```java

public class RedisIdGenerator {

  private static final String KEY = "id_generator";

private JedisPool jedisPool;

  public RedisIdGenerator(JedisPool jedisPool) {

this.jedisPool = jedisPool;

  }

public long nextId() {

  try (Jedis jedis = jedisPool.getResource()) {

return jedis.incr(KEY);

  }

}

  }

```

  使用Snowflake算法自增ID

  Snowflake算法是一种分布式ID生成算法,它可以生成唯一的、有的、可排的ID。Snowflake算法的原理是将一个64的long类的ID分成5个部分,分别是时间戳、数据中心ID、机器ID、列号、保留Fum中时间戳占用了41,可以表示69年的时间,数据中心ID和机器ID可以根据需要分配,列号占用了12,可以生成4096个不同的ID。使用Snowflake算法自增ID的优点是生成的ID唯一、有、可排,缺点是实现相对复杂来源www.hellomonster.net

下面是使用Snowflake算法自增ID的示例代码:

```java

  public class SnowflakeIdGenerator {

  private static final long START_TIMESTAMP = 1625097600000L; // 2021-07-01 00:00:00

  private static final long DATA_CENTER_ID_BITS = 5L;

private static final long MACHINE_ID_BITS = 5L;

  private static final long SEQUENCE_BITS = 12L;

  private static final long MAX_DATA_CENTER_ID = ~(-1L << DATA_CENTER_ID_BITS);

  private static final long MAX_MACHINE_ID = ~(-1L << MACHINE_ID_BITS);

  private static final long MAX_SEQUENCE = ~(-1L << SEQUENCE_BITS);

  private static final long DATA_CENTER_ID_SHIFT = MACHINE_ID_BITS + SEQUENCE_BITS;

  private static final long MACHINE_ID_SHIFT = SEQUENCE_BITS;

  private static final long TIMESTAMP_SHIFT = DATA_CENTER_ID_BITS + MACHINE_ID_BITS + SEQUENCE_BITS;

private static final Random RANDOM = new Random();

private final long dataCenterId;

  private final long machineId;

  private long sequence = 0L;

  private long lastTimestamp = -1L;

public SnowflakeIdGenerator(long dataCenterId, long machineId) {

  if (dataCenterId > MAX_DATA_CENTER_ID || dataCenterId < 0) {

  throw new IllegalArgumentException("Data center ID can't be greater than " + MAX_DATA_CENTER_ID + " or less than 0");

  }

  if (machineId > MAX_MACHINE_ID || machineId < 0) {

  throw new IllegalArgumentException("Machine ID can't be greater than " + MAX_MACHINE_ID + " or less than 0");

  }

  this.dataCenterId = dataCenterId;

  this.machineId = machineId;

  }

public synchronized long nextId() {

long timestamp = System.currentTimeMillis();

if (timestamp < lastTimestamp) {

  throw new RuntimeException("Clock moved backwards, refusing to generate ID for " + (lastTimestamp - timestamp) + " milliseconds");

  }

  if (timestamp == lastTimestamp) {

  sequence = (sequence + 1) & MAX_SEQUENCE;

if (sequence == 0) {

timestamp = tilNextMillis(lastTimestamp);

  }

} else {

  sequence = RANDOM.nextInt(100);

  }

  lastTimestamp = timestamp;

return ((timestamp - START_TIMESTAMP) << TIMESTAMP_SHIFT) | (dataCenterId << DATA_CENTER_ID_SHIFT) | (machineId << MACHINE_ID_SHIFT) | sequence;

}

  private long tilNextMillis(long lastTimestamp) {

  long timestamp = System.currentTimeMillis();

  while (timestamp <= lastTimestamp) {

  timestamp = System.currentTimeMillis();

  }

Java自增ID实现(3)

return timestamp;

}

}

```

  总结

  本文介绍了Java自增ID的三种实现方式,包括使用数据库自增ID、使用Redis自增ID、使用Snowflake算法自增ID。不同的实现方式各有优缺点,需要根据具体的场景选择合适的实现方式第+一+编+程+网

0% (0)
0% (0)
标签:实现
版权声明:《Java自增ID实现》一文由第一编程网(www.hellomonster.net)网友投稿,不代表本站观点,版权归原作者本人所有,转载请注明出处,如有侵权、虚假信息、错误信息或任何问题,请尽快与我们联系,我们将第一时间处理!

我要评论

评论 ( 0 条评论)
网友评论仅供其表达个人看法,并不表明好好孕立场。
最新评论

还没有评论,快来做评论第一人吧!
相关文章
  • java代理是什么意思

    Java代理是一种常见的设计模式,它允许对象通过代理对象来访问另一个对象。Java代理可以帮助我们在不改变原始对象的情况下,为其添加额外的功能或限制访问。Java代理通常分为两种类型:静态代理和动态代理。静态代理是在编译时创建的,而动态代理是在运行时创建的。静态代理

    [ 2024-05-13 10:50:58 ]
  • 关于Java中get方法的使用

    在Java中,get方法是一种常见的方法,它通常用于获取对象的属性值。本文将介绍get方法的基本概念、使用方法以及一些注意事项。一、get方法的基本概念get方法是一种访问器方法,也称为getter方法。它通常用于获取对象的属性值,而不是直接访问对象的属性。

    [ 2024-05-13 10:39:49 ]
  • 如何设置Java代码格式化的快捷键?

    Java是一种广泛使用的编程语言,它的语法结构比较复杂。为了方便编写和阅读Java代码,我们需要对其进行格式化。而设置Java代码格式化的快捷键可以大大提高我们的工作效率。在本文中,我们将介绍如何设置Java代码格式化的快捷键。第一步:打开Eclipse IDE

    [ 2024-05-13 09:36:34 ]
  • 日本做java开发

    Java是一种广泛使用的编程语言,其应用范围涵盖了Web开发、移动应用、桌面应用、游戏开发等多个领域。在日本,Java开发也是一项非常重要的技术,许多公司都在招聘Java开发人员。本文将介绍日本的Java开发行业,包括该行业的现状、就业前景、薪资待遇、技能要求等方面。一、日本Java开发行业现状

    [ 2024-05-13 08:57:41 ]
  • java局部变量初始值

    Java是一种强类型语言,这意味着在声明变量时必须指定其类型。在Java中,变量可以是类变量(静态变量)、实例变量(非静态变量)或局部变量。局部变量是在方法、构造函数或块中声明的变量,它们只在声明它们的代码块中可见。在本篇文章中,我们将探讨Java局部变量的初始值。Java局部变量的初始值

    [ 2024-05-13 07:56:47 ]
  • java生成pdf表格

    Java是一种广泛使用的编程语言,它可以用于开发各种类型的应用程序,包括生成PDF表格。PDF(Portable Document Format)是一种广泛使用的文件格式,它是一种可靠的文件格式,可以在不同的操作系统和设备上保持其格式和布局。在本文中,我们将探讨如何使用Java生成PDF表格。1. 使用iText库生成PDF表格

    [ 2024-05-13 07:34:13 ]
  • java排序算法

    Java是一种广泛使用的编程语言,它提供了许多排序算法来对数据进行排序。排序算法是计算机科学中的一个基本问题,它的目的是将一组元素按照一定的顺序进行排列。在本文中,我们将介绍Java中常用的排序算法,包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序和堆排序。1. 冒泡排序

    [ 2024-05-13 06:42:29 ]
  • java输出后不换行

    Java是一种面向对象的编程语言,使用广泛,特别是在企业级应用程序开发中。在Java中,输出后不换行是一种常见的需求。本文将介绍如何在Java中实现输出后不换行。一、使用System.out.print()方法输出在Java中,使用System.out.print()方法可以输出不换行的内容。

    [ 2024-05-13 06:06:46 ]
  • java如何返回上一步

    在Java中,要返回上一步有多种方法,这取决于你的具体需求和代码实现。在本文中,我们将探讨一些常见的方法,以及它们的优缺点。1. 使用return语句return语句是最常见的方法之一,它可以用来退出当前方法,并返回一个值(如果有的话)。例如,假设你有一个方法需要检查一个数字是否为偶数,如果是,则返回true,否则返回false。

    [ 2024-05-13 04:45:12 ]
  • 大数据与Java:两者的优缺点比较

    随着大数据时代的到来,越来越多的企业开始关注和应用大数据技术。而在大数据技术的应用中,Java作为一种最常用的编程语言之一,也扮演着十分重要的角色。那么,大数据和Java哪个更好呢?本文将从不同的角度对两者进行比较,以便更好地了解它们的优缺点。一、适用范围

    [ 2024-05-13 03:34:07 ]