版权声明:望支持~~~ https://blog.csdn.net/u011663149/article/details/86528723
前言:
在多线程、高并发情况下,某些业务场景需要创建唯一标识的主键(订单)Id;通常情况下都是一个请求创建一个,考虑到性能和QPS我们会提前生成好一堆随机id保存到redis;从redis进行pull。
1、创建一个redis队列服务
@Service
public class RedisPublicService {
@Resource
public Redisson redisson;
private RQueue<Long> pkQueue;
@PostConstruct
public void init() {
pkQueue=redisson.getQueue("GENERATOR_PRIMARY_KEY");
}
public RQueue<Long> getPkQueue(){
return pkQueue;
}
}
2、创建线程进行生成批量id
@Component
public class GeneratePrimaryKeyTask extends Thread{
@Autowired
private RedisPublicService redisService;
private final int cnt=10000;
private final Random random=new Random();
public Long getPrimaryId() {
//length=18 ;变量赋随机值1000-9999
return System.currentTimeMillis()*100000+random.nextInt(99999);
}
public Set<Long> getPrimaryIds(int num) {
Set<Long> ids = new HashSet<Long>();
while(ids.size()!=num){
ids.add(getPrimaryId());
}
return ids;
}
@PostConstruct
public void startup(){
this.start();
}
Logger log = LoggerFactory.getLogger(GeneratePrimaryKeyTask.class);
@SuppressWarnings("static-access")
public void run(){
RQueue<Long> que=redisService.getPkQueue();
while(true){
if(que.size()<cnt){ //当队列的数量小于cnt就会生成插入
que.addAll(getPrimaryIds(cnt));
log.info("create pk to redis current amount:"+que.size());
}else{
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
以上就是生成批量id的简单使用~~~
之前的csdn找不回来了,决定重新注册一个。望支持~~~