1. 程式人生 > >redis模擬搶紅包併發

redis模擬搶紅包併發

 public static void main(String[] args) {

        //迴圈測試
        for (int i = 0; i <10; i++){
            checkConcurrentCift();
        }
    }

    //用於計算併發紅包掙搶後的累計金額,驗證是否存在併發多讀資料
    static AtomicInteger p = new AtomicInteger(0);

    //測試紅包併發
    public static void checkConcurrentCift(){
        RedisCacheCustomer instance = RedisCacheCustomer.getInstance();
        Jedis jedis = instance.getJedisSelectDb(1);

        for(int j = 0; j < 100; j++) {
            jedis.lpush("test-list:gift", 1 + "");
        }

        instance.closeJedis(jedis);
        System.out.println("模擬紅包資料儲存完畢");


        //模擬多執行緒搶紅包
        ThreadPoolExecutor tp = new ThreadPoolExecutor(100, 100, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(20000));


        //105個執行緒併發爭搶紅包
        for (int i = 0; i < 105; i++) {
            tp.execute(new Runnable() {
                @Override
                public void run()
                {
                    RedisCacheCustomer instance = RedisCacheCustomer.getInstance();
                    Jedis jedis = instance.getJedisSelectDb(1);
                    String rpoplpush = jedis.rpoplpush("test-list:gift", "test-list:all");
                    if(rpoplpush == null){
                        System.out.println("未搶到啊!!");
                        return;
                    }
                    p.addAndGet(Integer.valueOf(rpoplpush));
                    //System.out.println(Thread.currentThread().getName()+"領取紅包-"+rpoplpush);
                    instance.closeJedis(jedis);
                }
            });
        }
        tp.shutdown();

        //檢測執行緒池是不是都執行完成
        try {
            tp.awaitTermination(1, TimeUnit.DAYS);
            System.out.println("領取完畢");
            Long del = jedis.del("test-list");
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(p);

    }

}