在系统中,除了使用数据库表本身的Id,如何生成各种业务Id?一下记录几种生成Id的方式:
- 使用数据库表记录生成的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); }
相关推荐
既然要sharding,那么不可避免的要讨论到sharding key问题,在有些业务系统中,必须保证sharding key全局唯一,比如存放商品的数据库等,那么如何生成全局唯一的ID呢,下文将从DBA的角度介绍几种常见的方案。...
4. 在内存中增加序号,根据规则生成业务ID并返回给调用方; 5. 使用指定步长更新数据库,虽有一定损耗(如发布重启导致序列号浪费),但由于循环使用,对业务影响较小。 以上内容概述了支付系统中业务ID的重要性和...
- **使用 IP 地址**:虽然文中没有明确提到,但在实际应用中,可以将当前机器的 IP 地址加入到 ID 的生成过程中,这样即使在分布式环境中也能保证 ID 的全局唯一性。 - **其他信息的整合**:根据业务需求,还可以...
Java中的快速ID自增器通常是通过以下几种方式实现的: 1. **原子类**:Java的`AtomicLong`类是线程安全的,可以用于实现自增ID。每次获取新ID时,只需要调用`incrementAndGet()`方法,该方法会原子性地增加当前值并...
在分布式系统中,由于多个节点并行处理请求,每个节点都需要生成不重复的ID,以确保数据的一致性和完整性。传统的单机ID生成方式,如自增主键,无法满足这种需求,因此分布式代码生成器应运而生。 1. **雪花算法...
以下将详细讨论几种在PHP中生成唯一ID的方法。 1. **MD5与随机数结合**: ```php md5(time() . mt_rand(1,1000000)); ``` 这种方法通过将当前时间戳与一个随机数相连接,然后使用MD5哈希函数将其转换为固定长度...
在IT行业中,生成全局唯一的ID(Identifier)是一个常见的需求,特别是在分布式系统中,数据库记录、消息队列等都需要这样的标识符。"生成数字的全局唯一Id.zip" 提供了一个Java实现,利用雪花算法来生成Long类型的...
分布式ID生成是现代互联网系统中不可或缺的一个环节,它在各种业务场景中起到标识唯一对象的作用。为了满足分布式环境的需求,生成的ID需要具备以下几个关键特性: 1. 唯一性:确保每个ID在全球范围内都是独一无二...
下面将详细介绍几种可能的方法,并探讨它们的优缺点。 1. **UUID(通用唯一标识符)**: UUID是一种广泛使用的标准,它能生成128位的唯一标识符。UUID基于时间戳、随机数和MAC地址等信息生成,几乎不可能重复。在...
本文将对比分析几种常见的生成全局唯一序列号的策略,以供IT从业者参考。 1. **雪花算法(Snowflake)** 雪花算法是由Twitter开源的一种生成全局唯一ID的方法。其ID由64位组成,分为以下几个部分:41位的时间戳...
这个工具是基于“雪花算法”设计的,雪花算法是一种广泛应用于分布式系统中的ID生成策略,确保在多台服务器之间生成全局唯一的ID。 雪花算法的核心思想是将ID分为几个部分:时间戳、工作机器ID和序列号。时间戳部分...
在大数据量和高并发的分布式系统中,维护...尽管在实际应用中可能还需要进一步的优化和调校,但SnowflakeX无疑是当前市场上极具竞争力的分布式ID生成器之一,值得在需要高效、安全ID生成机制的分布式系统中推广使用。
针对以上几种方法存在的问题,可以借鉴Twitter的Snowflake算法思想,结合具体的业务场景和并发量需求,设计出适用于特定环境的分布式ID生成方案。Snowflake算法的核心思路是: - **时间戳**:占41位,用来表示ID...
以下是几种常见的分布式ID生成解决方案的概述: 1. 系统时间毫秒数+业务属性+用户属性+随机数 这种方法通过组合多种参数来确保ID的唯一性,但可能无法保证ID的有序性。如果需要有序ID,需要借助额外的存储,例如...
生成识别码的方法多种多样,常见的有以下几种: 1. **随机数生成**:利用系统时钟或者其他随机源生成一串数字,确保其独特性。这种方法简单易行,但需要避免重复,因此可能需要配合数据库检查。 2. **哈希函数**:...
本文将深入探讨Hibernate中自动生成主键的几种常见策略及其应用场景。 ### 1. UUID.hex UUID(Universally Unique Identifier)是一种生成全局唯一标识符的方式,其长度为128位,通常表示为32个十六进制数字组成的...
下面将逐一分析几种常见的方法: ##### 1. 使用数据库的`auto_increment`功能 这种方法简单直观,利用数据库自身提供的自增功能生成ID。它具有以下优点: - **简单易行**:直接利用数据库的特性; - **保证唯一性*...
在实际使用中,我们需要根据具体业务需求和性能要求,对这三个组件进行适当的配置和调优,以实现最佳的系统性能和稳定性。此外,还需要关注组件之间的协调和兼容性,以确保整个分布式系统的顺畅运行。
但是,这种方法也存在一些问题,如在与其他系统集成时,脱离了系统中的生成方法后,很麻烦保证自制表中的最大值与导入后的保持一致。 第五种:GUID 主键 这种方法是采用 GUID,当然我是推荐主键还是字符型的,但值...