生成16位不重復序列號


16位隨機數的組成:時間戳+自增長序列

時間戳長度為13位,自增長數字序列為1~999。由於后三位只能從1~999,所以在1ms內只能有999個不重復的隨機數。1ms的並發數最大只能到999,如果對位數沒有要求,可以多添加幾位自增長序列,可以提高並發的數量。我做的業務,999的並發量足夠使用。

代碼如下:

public class Random {
    //private static int index = 0;
    static  AtomicInteger index = new AtomicInteger(0);
    static Jedis jedis;
    public static void main(String[] args){
        jedis =new Jedis("127.0.0.1", 6379);
new Thread(new Runnable() { @Override public void run() { while(true){ String timestamp = String.valueOf(new Date().getTime()); String key = timestamp + String.valueOf(new Random().getIndex()); System.out.println("1: " + key ); String value = getKey(key); if(value!= null){ System.out.println("key: " + key); index.set(1000); }else { setKey(key); } Thread.yield(); if(index.get() == 1000) break; } } }).start(); new Thread(new Runnable() { @Override public void run() { while(true){ String timestamp = String.valueOf(new Date().getTime()) ; String key = timestamp + String.valueOf(new Random().getIndex()); System.out.println("2: " + key ); String value = getKey(key); if(value!= null){ System.out.println("key: " + key); index.set(1000); }else{ setKey(key); } Thread.yield(); if(index.get() == 1000) break; } } }).start(); new Thread(new Runnable() { @Override public void run() { while(true){ String timestamp = String.valueOf(new Date().getTime()) ; String key = timestamp + String.valueOf(new Random().getIndex()); System.out.println("3: " + key ); String value = getKey(key); if(value!= null){ System.out.println("key: " + key); index.set(1000); }else{ setKey(key); } Thread.yield(); if(index.get() == 1000) break; } } }).start(); /*try { TimeUnit.MILLISECONDS.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("size: " + map.size());*/ } private String getIndex(){ synchronized(Random.class){ index.getAndIncrement(); if(index.get() == 1000) index.set(0); return String.format("%03d", index.get()); } } public static void setKey(String key){ synchronized(Random.class){ jedis.set(key, key); } } public static String getKey(String key){ synchronized(Random.class){ return jedis.get(key); } } }

 

代碼使用三個線程模擬模擬請求,使用jredis 存儲生成的數字,長時間運行來校驗,是否會生成,重復的序列號。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM