使用数据库和Redis,生成序列号或流水号。当Redis中没值,加载数据库中的最大值,存入Redis中。
一、配置Spring Boot的Redis,使Spring Context的有RedisConnectionFactory。
二、创建Redistemplate:
@Configuration
@EnableCaching
public class RedisConfig {
@Bean
public RedisTemplate<String, Long> redisTemplateSerial(RedisConnectionFactory factory) {
RedisTemplate<String, Long> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
template.setValueSerializer(new GenericToStringSerializer<Long>(Long.class));
return template;
}
}
三、生成序列号、流水号的代码:
public class SerialGenerate<T extends SerialNo> {
@Resource
private T tMapper;
@Resource(name = "redisTemplateSerial")
private RedisTemplate<String, Long> redisTemplateSerial;
public String gen() {
// 生成编码
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
Long redisSerial = redisTemplateSerial.opsForValue().increment(RedisConstant.serial);
String yyyyMMdd = null;
// 今天年月日
String yyyyMMddCurrent = format.format(new Date());
// 流水号
String serial = "00001";
if(redisSerial == null || redisSerial.toString().length() < 13) {
// 如果redis中为空,则从数据库中加载今天最大值,并增加1.
List<Entity> entity = tMapper.queryMax(yyyyMMddCurrent);
if(ObjectUtil.isNotEmpty(entity)) {
serial = String.valueOf(Long.parseLong(entity.get(0).getNo().substring(8, 13)) + 1);
// 如果数据溢出
BusinessException.isTrue(Long.parseLong(serial) <= 99999L, ExceptionEnum.ExceptionMAX);
}
redisSerial = Long.valueOf(yyyyMMddCurrent + serial);
redisTemplateSerial.opsForValue().set(RedisConstant.serial, redisSerial);
} else {
// 如果redis中的值已存在,需要判断是否当天的流水,不是的话,需要重置日期和流水。
yyyyMMdd = redisSerial.toString().substring(0, 8);
if(ObjectUtil.notEqual(yyyyMMdd, yyyyMMddCurrent)) {
// 如果不是今天.
redisSerial = Long.valueOf(yyyyMMddCurrent + serial);
redisTemplateSerial.opsForValue().set(RedisConstant.serial, redisSerial);
}
}
return redisSerial.toString();
}
}