大致实现逻辑
后台写一个通用方法,参数为履行合同业务类型和公司代码,返回值为16位的履行行行号。
- 生成规则:履行合同业务类型1位+公司代码4位+年份2位+流水号9位(每个公司每年的流水号都从1开始)。例如:1 0021 20 000000001。
- 用子项目编码+公司代码+年份做Redis键,值为流水号。
- 流水号:由于直接用Java代码生成在集群环境会有问题,故采用redisTemplate的increment(key,delta)方法生成,初次调用该方法会返回1。
- 格式化:Redis返回的是自增的数字,需要格式化为9位流水号。Java代码如下:
1 | String.format("%09d",serialNumber); |
RedisTemplate使用碰坑
redisTemplate. opsForValue(). set(key,value)这种方式存入Redis后会把数字型的值转为字符串,以后调用increment(key,delta)方法报错。原因是底层采用了JdkSerializationRedisSerializer序列化机制。解决方法有如下两种:
- 采用序列化方式
1 | redisTemplate.setKeySerializer(new StringRedisSerializer()); |
赋值方法也要改(值为字符串),例如:
1 | redisTemplate. opsForValue().set(key,"0") |
- 使用StringRedisTemplate
1 | Long serialNumber = stringRedisTemplate. opsForValue().increment(key,1); |