1.需求描述
每天生产: 日期+6位顺序序号 日期格式yyyyMMdd
2.实现方式
1.不使用redis, 可考虑用static 静态实现(前提是当天服务不能重启,否则不起作用)
2.考虑数据库,并写一个存储函数,每次取值加一,java判断当天日期是否和数据库存储的日期是否为同一天,不同则初始化计数值
3.推荐方式 redis 可拓展至N位,只需要修改 String.format("%06d", i);中的数字
思路
1.redis 放一个日期key ,然后放一个数字key 每次比较日期,日期不同则初始化,日期相同则取数加一并设置数字key
未考虑溢出情况若每天生超过6位,需要注意
喜欢的点个赞!
/**
* 非分布式环境
* @return
*/
public synchronized String getSequence(){
String date_incr = redisTemplate.opsForValue().get("date_incr");
String num_incr = redisTemplate.opsForValue().get("num_incr");
String yyyyMMdd = new SimpleDateFormat("yyyyMMdd").format(new Date());
/**
* 1.当redis的日期和现在不一样,则设置日期,计数器置为1,并在取数据时将加一的数据存于redis中
* 2. 日期一样则将redis中的数据取出并加一
*/
StringBuilder sb = new StringBuilder();
if (StringUtils.isEmpty(date_incr)||!yyyyMMdd.equals(date_incr)){
redisTemplate.opsForValue().set("date_incr",yyyyMMdd);
redisTemplate.opsForValue().set("num_incr","1");
String data = addOne("000000");
StringBuilder append = sb.append(yyyyMMdd).append(data);
return sb.toString();
}else {
String s = addOne(num_incr);
sb.append(date_incr).append(s);
return sb.toString();
}
}
public String addOne(String data){
int i = Integer.parseInt(data);
i++;
String format = String.format("%06d", i);
redisTemplate.opsForValue().set("num_incr",format);
return format;
}