使用redis批量生成主键(订单)Id

版权声明:望支持~~~ 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找不回来了,决定重新注册一个。望支持~~~

猜你喜欢

转载自blog.csdn.net/u011663149/article/details/86528723