1.维护排除列表:在 Redis 中维护一个已导入的 my_id 列表,存储所有导入过程中出现的特殊 my_id 数字部分(例如,F9999999 的数字部分为 9999999)。
2.自增时跳过已存在的 my_id:每次生成新的 my_id 时,先检查自增值是否在排除列表中,若在,则继续自增,直到找到不在排除列表中的值为止。
public class MyIdGeneratorService {
@Autowired
private StringRedisTemplate redisTemplate;
private static final String MY_ID_KEY = "capex_draft_tool:my_id";
private static final String EXCLUDED_KEY = "capex_draft_tool:excluded_ids";
public String generateMyId(String fab) {
String prefix = getPrefixByFab(fab);
Long idValue;
do {
idValue = redisTemplate.opsForValue().increment(MY_ID_KEY);
} while (redisTemplate.opsForSet().isMember(EXCLUDED_KEY, idValue.toString()));
String formattedNumber = String.format("%07d", idValue);
return prefix + formattedNumber;
}
public void importMyId(String importedMyId) {
int importedNumber = Integer.parseInt(importedMyId.substring(1));
redisTemplate.opsForSet().add(EXCLUDED_KEY, String.valueOf(importedNumber));
}
private String getPrefixByFab(String fab) {
switch (fab) {
case "A1":
return "F";
default:
return "X";
}
}
}
方案说明
EXCLUDED_KEY:这是一个 Redis Set 集合,用于存储导入过程中已存在的特殊 my_id 数字部分- 生成新
my_id
1.每次自增得到新值后,先查询 EXCLUDED_KEY 集合,判断该值是否被占用。
2.若占用则继续自增,直到找到不在排除列表中的值为止 - 当导入的
my_id不符合生成规则时,将其数字部分添加到 EXCLUDED_KEY 集合中,以确保后续生成不会重复
优点
- 避免浪费中间未使用的数值:通过排除列表,只占用必要的特殊数值,保留中间未使用的范围
- 可扩展性强:可以灵活应对后续其他特殊 my_id 的导入,不影响自增策略。
