生成履行行行号及RedisTemplate使用碰坑

大致实现逻辑

后台写一个通用方法,参数为履行合同业务类型和公司代码,返回值为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
2
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());

赋值方法也要改(值为字符串),例如:

1
redisTemplate. opsForValue().set(key,"0")
  • 使用StringRedisTemplate
1
Long serialNumber = stringRedisTemplate. opsForValue().increment(key,1);