`
lxlong
  • 浏览: 81777 次
社区版块
存档分类
最新评论

在系统中生成业务ID的几种方法

    博客分类:
  • java
 
阅读更多

在系统中,除了使用数据库表本身的Id,如何生成各种业务Id?一下记录几种生成Id的方式:

  1. 使用数据库表记录生成的Id,以MySQL为例:

1) 首先创建一个数据库表,来记录当前的业务Id

CREATE TABLE `global_auto_number` (
  `id` varchar(32) NOT NULL,
  `version_optimized_lock` int(11) NOT NULL,
  `business_key` varchar(255) NOT NULL COMMENT 'Can use full business class name as business key',
  `current_num` bigint(22) NOT NULL COMMENT 'current number',
  PRIMARY KEY (`id`),
  UNIQUE KEY `UK_AUTO_NUMBER` (`business_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

 2) 获取Id的方法:

int currentCount = jdbcTemplate.update("update global_auto_number set current_num = LAST_INSERT_ID(current_num + 1) where business_key = ?", new Object[] {businessKey});

if(currentCount == 0) {
     jdbcTemplate.update("insert into global_auto_number (id, version_optimized_lock, business_key, current_num) values (?, 1, ?, 0)", new Object[] {UUIDGenerator.generateUUID(),businessKey});
     jdbcTemplate.update("update global_auto_number set current_num = LAST_INSERT_ID(current_num + 1) where business_key = ?", new Object[] {businessKey});
}
return jdbcTemplate.queryForLong("select LAST_INSERT_ID()");

 3) 按照业务逻辑格式化获取的Id。例如:

String.format("SEQ%09d", 123)

 4) 注意事务需要用REQUIRES_NEW,否则在并发环境下会出现大量乐观锁问题。

 

2. 使用随机数来生成随机的Id,例如使用同一个Id来追踪后台响应用户操作的各种log

   public static String generateRandomId() {
      byte[] bytes = new byte[10];
      try {
         SecureRandom.getInstance("SHA1PRNG").nextBytes(bytes);
      }
      catch (NoSuchAlgorithmException e) {
         throw new RuntimeException(e);
      }
      return toHexString(bytes);
   }
   
   final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
   public static String toHexString(byte[] bytes) {
       char[] hexChars = new char[bytes.length * 2];
       for ( int j = 0; j < bytes.length; j++ ) {
           int v = bytes[j] & 0xFF;
           hexChars[j * 2] = hexArray[v >>> 4];
           hexChars[j * 2 + 1] = hexArray[v & 0x0F];
       }
       return new String(hexChars);
   }

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Mysql全局ID生成方法

    既然要sharding,那么不可避免的要讨论到sharding key问题,在有些业务系统中,必须保证sharding key全局唯一,比如存放商品的数据库等,那么如何生成全局唯一的ID呢,下文将从DBA的角度介绍几种常见的方案。...

    06.交易流水号的艺术:掌握支付系统的业务ID生成指南_V20240130.pdf

    4. 在内存中增加序号,根据规则生成业务ID并返回给调用方; 5. 使用指定步长更新数据库,虽有一定损耗(如发布重启导致序列号浪费),但由于循环使用,对业务影响较小。 以上内容概述了支付系统中业务ID的重要性和...

    javaID生成器javaID生成器

    - **使用 IP 地址**:虽然文中没有明确提到,但在实际应用中,可以将当前机器的 IP 地址加入到 ID 的生成过程中,这样即使在分布式环境中也能保证 ID 的全局唯一性。 - **其他信息的整合**:根据业务需求,还可以...

    java快速ID自增器

    Java中的快速ID自增器通常是通过以下几种方式实现的: 1. **原子类**:Java的`AtomicLong`类是线程安全的,可以用于实现自增ID。每次获取新ID时,只需要调用`incrementAndGet()`方法,该方法会原子性地增加当前值并...

    java 分布式 代码生成器 唯一ID

    在分布式系统中,由于多个节点并行处理请求,每个节点都需要生成不重复的ID,以确保数据的一致性和完整性。传统的单机ID生成方式,如自增主键,无法满足这种需求,因此分布式代码生成器应运而生。 1. **雪花算法...

    php 生成唯一id的几种解决方法

    以下将详细讨论几种在PHP中生成唯一ID的方法。 1. **MD5与随机数结合**: ```php md5(time() . mt_rand(1,1000000)); ``` 这种方法通过将当前时间戳与一个随机数相连接,然后使用MD5哈希函数将其转换为固定长度...

    生成数字的全局唯一Id.zip

    在IT行业中,生成全局唯一的ID(Identifier)是一个常见的需求,特别是在分布式系统中,数据库记录、消息队列等都需要这样的标识符。"生成数字的全局唯一Id.zip" 提供了一个Java实现,利用雪花算法来生成Long类型的...

    分布式id生成详解.pdf

    分布式ID生成是现代互联网系统中不可或缺的一个环节,它在各种业务场景中起到标识唯一对象的作用。为了满足分布式环境的需求,生成的ID需要具备以下几个关键特性: 1. 唯一性:确保每个ID在全球范围内都是独一无二...

    测试多种方法生成唯一性随机码Demo

    下面将详细介绍几种可能的方法,并探讨它们的优缺点。 1. **UUID(通用唯一标识符)**: UUID是一种广泛使用的标准,它能生成128位的唯一标识符。UUID基于时间戳、随机数和MAC地址等信息生成,几乎不可能重复。在...

    分布式架构系统生成全局唯一序列号的一些思路对比分析

    本文将对比分析几种常见的生成全局唯一序列号的策略,以供IT从业者参考。 1. **雪花算法(Snowflake)** 雪花算法是由Twitter开源的一种生成全局唯一ID的方法。其ID由64位组成,分为以下几个部分:41位的时间戳...

    UID生成器.rar

    这个工具是基于“雪花算法”设计的,雪花算法是一种广泛应用于分布式系统中的ID生成策略,确保在多台服务器之间生成全局唯一的ID。 雪花算法的核心思想是将ID分为几个部分:时间戳、工作机器ID和序列号。时间戳部分...

    分布式ID生成器解决方案SnowflakeX.docx

    在大数据量和高并发的分布式系统中,维护...尽管在实际应用中可能还需要进一步的优化和调校,但SnowflakeX无疑是当前市场上极具竞争力的分布式ID生成器之一,值得在需要高效、安全ID生成机制的分布式系统中推广使用。

    分布式ID生成

    针对以上几种方法存在的问题,可以借鉴Twitter的Snowflake算法思想,结合具体的业务场景和并发量需求,设计出适用于特定环境的分布式ID生成方案。Snowflake算法的核心思路是: - **时间戳**:占41位,用来表示ID...

    分布式ID生成器的解决方案总结.docx

    以下是几种常见的分布式ID生成解决方案的概述: 1. 系统时间毫秒数+业务属性+用户属性+随机数 这种方法通过组合多种参数来确保ID的唯一性,但可能无法保证ID的有序性。如果需要有序ID,需要借助额外的存储,例如...

    网络游戏-网络中的识别码生成方法及识别码生成程序.zip

    生成识别码的方法多种多样,常见的有以下几种: 1. **随机数生成**:利用系统时钟或者其他随机源生成一串数字,确保其独特性。这种方法简单易行,但需要避免重复,因此可能需要配合数据库检查。 2. **哈希函数**:...

    hibernate中自动生成主键的办法

    本文将深入探讨Hibernate中自动生成主键的几种常见策略及其应用场景。 ### 1. UUID.hex UUID(Universally Unique Identifier)是一种生成全局唯一标识符的方式,其长度为128位,通常表示为32个十六进制数字组成的...

    分布式id方法

    下面将逐一分析几种常见的方法: ##### 1. 使用数据库的`auto_increment`功能 这种方法简单直观,利用数据库自身提供的自增功能生成ID。它具有以下优点: - **简单易行**:直接利用数据库的特性; - **保证唯一性*...

    分布式锁+id生成器+限流工具

    在实际使用中,我们需要根据具体业务需求和性能要求,对这三个组件进行适当的配置和调优,以实现最佳的系统性能和稳定性。此外,还需要关注组件之间的协调和兼容性,以确保整个分布式系统的顺畅运行。

    数据库主键的五种设计方法

    但是,这种方法也存在一些问题,如在与其他系统集成时,脱离了系统中的生成方法后,很麻烦保证自制表中的最大值与导入后的保持一致。 第五种:GUID 主键 这种方法是采用 GUID,当然我是推荐主键还是字符型的,但值...

Global site tag (gtag.js) - Google Analytics