📦 優雅版 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