package com.ls.sequence;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
/**
* Created by ls on 2023/6/2.
*/
@Component
public class SequenceHandler {
@Resource
private RedisTemplate<String, Object> redisTemplate;
public String getNo(String busId, int step) {
//当天日期,比如20221226
String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
//保存redis中的key,注意不要重复
String redisKey = "uniqueNo_" + date;
//利用increment即redis原生incrBy命令的原子性特性生成递增的序列号
Long increment = redisTemplate.opsForValue().increment(redisKey, step);
if (increment == null) {
throw new RuntimeException("redis命令执行失败");
}
if (step == increment.intValue()) {
//首次执行时,给redisKey设置ttl,第二天这个key就可以被redis自动删除
redisTemplate.expire(redisKey, 25, TimeUnit.HOURS);
}
//组合 20221226 + 业务id + 0001(可以根据需要自由调整序列号的长度)
return date + busId + String.format("%04d", increment);
}
/**
* 批量获取id
*
* @param size 获取的id个数,与步长类似
*/
public List<String> getNoByGroup(String redisKey, int size) {
String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
//设置步长为size,相当于一次性申请size个id
Long increment = redisTemplate.opsForValue().increment(redisKey, size);
if (increment == null) {
throw new RuntimeException("redis命令执行失败");
}
if (size == increment.intValue()) {
//首次执行时,给redisKey设置ttl,第二天这个key就可以被redis自动删除
redisTemplate.expire(redisKey, 25, TimeUnit.HOURS);
}
long begin = increment - Long.parseLong(size + "");
List<String> rs = new ArrayList<>();
for (long i = begin + 1; i <= increment; i++) {
String format = String.format("%04d", i);
rs.add(redisKey + "-" + date + format);
}
return rs;
}
public Queue<String> getNoByGroupQueue(String redisKey, int size) {
String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
//设置步长为size,相当于一次性申请size个id
Long increment = redisTemplate.opsForValue().increment(redisKey, size);
if (increment == null) {
throw new RuntimeException("redis命令执行失败");
}
if (size == increment.intValue()) {
//首次执行时,给redisKey设置ttl,第二天这个key就可以被redis自动删除
redisTemplate.expire(redisKey, 25, TimeUnit.HOURS);
}
long begin = increment - Long.parseLong(size + "");
Queue<String> queue = new ArrayDeque<String>();
for (long i = begin + 1; i <= increment; i++) {
String format = String.format("%06d", i);
queue.add(redisKey + "-" + date + format);
}
return queue;
}
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交