直接上代码
BaseRedisCode类相当于将需要生成流水号的业务类的相应配置存储在redis中,生成流水号时先去获取配置,按照配置生成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Data public class BaseRedisCode { private Class entity; private String prefix; private Integer num;
public BaseRedisCode(Class entity, String prefix, Integer num) { this.entity = entity; this.prefix = prefix; this.num = num; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| @Component @Slf4j public class RedisCodeInit implements ApplicationRunner { @Autowired private RedisTemplate<String, String> redisTemplate;
@Override public void run(ApplicationArguments args) throws Exception { log.info("=====开始初始化流水号====="); List<BaseRedisCode> baseRedisCodes = new ArrayList<>(); baseRedisCodes.add(new BaseRedisCode(Account.class, "AC", 6)); baseRedisCodes.add(new BaseRedisCode(Order.class, "OR", 8)); this.init(baseRedisCodes); log.info("=====初始化流水号完毕====="); }
public void init(List<BaseRedisCode> baseRedisCodes) { for (BaseRedisCode baseRedisCode : baseRedisCodes) { String redisKey = baseRedisCode.getEntity().getName(); redisTemplate.opsForValue().set(baseRedisCode.getEntity().getName(), JSON.toJSONString(baseRedisCode)); log.info(redisKey + "已初始化"); } } }
|
初始化后redis中的数据是这样的,圈起来的地方存储的就是BaseRedisCode对象信息,也就是相关业务的流水号配置信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| @Component public class RedisCodeUtil { @Autowired private RedisTemplate<String, String> redisTemplate;
public String gen(Class c) { String redisKey = c.getName(); if (null != redisTemplate.opsForValue().get(redisKey)) {
BaseRedisCode baseRedisCode = JSON.parseObject(redisTemplate.opsForValue().get(redisKey), BaseRedisCode.class); assert baseRedisCode != null; if (redisTemplate.opsForValue().get(baseRedisCode.getPrefix()) == null) { Long todayTime = LocalDate.now().plusDays(1).atTime(0, 0, 0, 1).atOffset(ZoneOffset.ofHours(8)).toEpochSecond(); Long nowTime = LocalDateTime.now().atOffset(ZoneOffset.ofHours(8)).toEpochSecond(); long expireTime = todayTime - nowTime; redisTemplate.opsForValue().set(baseRedisCode.getPrefix(), String.valueOf(0), expireTime * 1000, TimeUnit.MILLISECONDS); }
StringBuilder sn = new StringBuilder(); sn.append(baseRedisCode.getPrefix()); String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); sn.append(date); Long num = redisTemplate.opsForValue().increment(baseRedisCode.getPrefix()); sn.append(addZero(String.valueOf(num), baseRedisCode.getNum()));
return (sn.toString()); } return null; }
public String addZero(String numStr, Integer maxNum) { int addNum = maxNum - numStr.length(); StringBuilder rStr = new StringBuilder(); for (int i = 0; i < addNum; i++) { rStr.append("0"); } rStr.append(numStr); return rStr.toString(); } }
|
测试
1 2 3 4 5 6 7 8 9 10 11
| @RunWith(SpringRunner.class) @SpringBootTest(classes = SzjxApplication.class) public class Test1 { @Autowired private RedisCodeUtil redisCodeUtil;
@Test public void set(){ System.out.println(redisCodeUtil.gen(Order.class)); } }
|
最后流水号以前缀为key的方式存储