Redis自动生成业务编号(业务编码IN+yyyyMMdd时间日期+六位流水号)按顺序递增,避免查库消耗性能

473 阅读1分钟

redis配置类

package com.sca4cloud.sca.merchantsoperation.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @ClassName RedisConfig
 * @Description Redis配置类
 * @Author wdk
 * @Date 2022/1/22 10:42
 * @Version 1.0
 **/
@Configuration
public class RedisConfig {
   @Bean
   @SuppressWarnings("all")
   public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
      RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
      template.setConnectionFactory(factory);

      Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

      ObjectMapper om = new ObjectMapper();
      om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
      om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
      jackson2JsonRedisSerializer.setObjectMapper(om);

      StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
      //key采用String的序列化方式
      template.setKeySerializer(stringRedisSerializer);
      //hash的key也采用String的序列化方式
      template.setHashKeySerializer(stringRedisSerializer);
      //value序列化方式采用jackson
      template.setValueSerializer(jackson2JsonRedisSerializer);
      //hash的value序列化方式采用jackson
      template.setHashValueSerializer(jackson2JsonRedisSerializer);
      template.afterPropertiesSet();

      return template;
   }
}

业务生成的几位流水号工具类

public class SequenceUtils {

    static final int DEFAULT_LENGTH = 6;
    public static String getSequence(long seq) {
        String str = String.valueOf(seq);
        int len = str.length();
        if (len >= DEFAULT_LENGTH) {// 取决于业务规模,应该不会到达4
            return str;
        }
        int rest = DEFAULT_LENGTH - len;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < rest; i++) {
            sb.append('0');
        }
        sb.append(str);
        return sb.toString();
    }
}

例如新增进件的编号第一天为IN20220101000001,IN20220101000002,IN20220101000003 ......第二天IN20220102000001,IN20220102000002,IN20220102000003等

//新增进件编号
String date = new SimpleDateFormat("yyyyMMdd").format(new Date());
//进件编码
String purchaseCodekey="IN"+date;
Long increment = redisTemplate.opsForValue().increment(purchaseCodekey, 1);
String sequence = SequenceUtils.getSequence(increment);
//设置过期时间24小时
redisTemplate.expire(purchaseCodekey, 24, TimeUnit.HOURS);
StringBuilder sb = new StringBuilder();
sb.append(purchaseCodekey).append(sequence);
String purchaseCode = sb.toString();
moTaskPurchase.setPurchaseCode(purchaseCode);