📦 优雅版 Redis ID 生成器工具类
支持:
- 项目启动时自动初始化起始值
- 获取自增 ID 方法
- yml 配置化起始值
- 可灵活扩展多业务线 ID
📌 application.yml 配置
id-generator:member-start-value: 1000000000
📌 配置类:IdGeneratorProperties.java
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** Redis ID生成器相关配置*/
@Data
@Component
@ConfigurationProperties(prefix = "id-generator")
public class IdGeneratorProperties {/*** 会员ID生成器初始值*/private Long memberStartValue;
}
📌 工具类:RedisIdInitializer.java
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;/*** Redis ID生成器初始化 & 获取工具类** 功能:* 1. 项目启动时,自动初始化自增ID起始值* 2. 提供获取下一个会员ID的方法** 优势:* - 保证全局唯一、线程安全、自增递增* - 配置化管理,灵活可控* - 起始值高位,避免与老数据冲突*/
@Component
@RequiredArgsConstructor
public class RedisIdInitializer {private final StringRedisTemplate stringRedisTemplate;private final IdGeneratorProperties idGeneratorProperties;/*** Redis中会员ID生成器的key*/private static final String MEMBER_ID_KEY = "member:id:generator";/*** 项目启动时自动执行,初始化会员ID起始值*/@PostConstructpublic void initMemberIdStartValue() {// 检查 key 是否已存在,防止覆盖已用值Boolean hasKey = stringRedisTemplate.hasKey(MEMBER_ID_KEY);if (Boolean.FALSE.equals(hasKey)) {stringRedisTemplate.opsForValue().set(MEMBER_ID_KEY, String.valueOf(idGeneratorProperties.getMemberStartValue()));System.out.println("会员ID初始值已设置为:" + idGeneratorProperties.getMemberStartValue());}}/*** 获取下一个会员ID** @return 下一个递增会员ID*/public Long getNextMemberId() {return stringRedisTemplate.opsForValue().increment(MEMBER_ID_KEY);}
}
📌 使用方式
@Autowired
private RedisIdInitializer redisIdInitializer;// 获取下一个会员ID
Long newMemberId = redisIdInitializer.getNextMemberId();
System.out.println("新生成会员ID:" + newMemberId);
📊 总结
优势 | 说明 |
---|---|
全局唯一 | Redis INCR 原子性保障 |
并发安全 | 多线程/多服务节点同时操作也无冲突 |
起始值高位 | 避免与已有数据库自增ID冲突 |
配置化 | yml配置,随时灵活调整 |
易扩展 | 支持多业务线ID(如 order:id:generator 、card:id:generator ) |
性能高 | Redis内存操作,单次耗时微秒级 |
📦 后续扩展建议
✅ 支持多类型 ID(会员ID、订单ID、卡号ID)
✅ ID带日期前缀(2025043000001)
✅ 超过int最大值时,自动预警 or 换成Bigint