系统需要生成根据业务类型生成流水号,每天从 1 开始生成,第二天会清零继续从 0 开始,流水号格式为: bizCode + date + incr
如:TT-2017112300001。
思路:利用 Redis Incr 生成序列号,使用日期加业务编码作为组合 Key,这样保证第二天生成的序列号又是从 1 开始。
由于我们业务量不是很大,这里在生成序列号之前先判断一下当前 key 是否存在,若不存在,设置此 key 过期时间为当天晚上 23:59:59,避免生成很多过期的 key。
整体设计流程思路如下:
关键代码如下:
@Service public class SerialNumberServiceImpl implements ISerialNumberService { @Autowired private JedisCluster jedisCluster; /** * 定义流水号工单默认前缀 */ private static final String SERIAL_NUMBER = "itsm:serial:"; @Override public String generate(String bizCode) { if(StringUtils.isEmpty(bizCode)){ throw new ServiceException("流水号业务类型不能为空"); } //获取当前时间,返回格式如yyyyMMdd String date = TimeUtil.date2Str(new Date(), ItsmConstants.FORMATTER_YYYYMMDD_DAY); //构造redis过期时间 UnixMillis //设置过期时间为当前时间的最后一秒 long expire = TimeUtil.time2UnixMillis(date + " 23:59:59",ItsmConstants.FORMATTER_YYYYMMDD_TIME); //构造redis的key String key = SERIAL_NUMBER + date +":"+ bizCode; //判断key是否存在 Boolean exists = jedisCluster.exists(key); Long incr = jedisCluster.incr(key); //设置过期时间 if(!exists){ jedisCluster.pexpireAt(key,expire); } //默认编码需要5位,位数不够前面补0 String formattNum = String.format("%05d", incr); StringBuilder sb = new StringBuilder(20); //转换成业务需要的格式 bizCode + date + incr sb.append(bizCode).append("-").append(date).append("-").append(formattNum); return sb.toString(); } }
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于