redis模擬搶紅包併發
阿新 • • 發佈:2018-12-17
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); } }