用 ExecutorService executor = Executors.newFixedThreadPool(15);建立線程池,分別模擬1000個用戶去搶100個商品,線程池超過15個以後,商品竟然秒殺不完? 兩個類html
package redis; import java.util.List; import redis.clients.jedis.Jedis; import redis.clients.jedis.Transaction; public class SaleRunable implements Runnable { String productKey = "iphone8";//監視的key 當前秒殺商品的數量 Jedis jedis = new Jedis("192.168.17.128"); String userName; public SaleRunable(String userName) { this.userName = userName; } @Override public void run() { //商品的key , 秒殺有個數量 //watch 監視一個key,當事務執行以前這個key發生了改變,事務會被打斷 jedis.watch(productKey); String value = jedis.get(productKey); int num = Integer.valueOf(value); //此次秒殺的商品是100個iphone8 if (num <= 100 && num >= 1) { //開啓事務 Transaction tx = jedis.multi(); //減小一個商品數量 tx.incrBy(productKey, -1); //提交事務,若是商品數量發生了改動 則會返回null List<Object> list = tx.exec(); if (list == null || list.size() == 0) { System.out.println(userName + "商品搶購失敗!"); } else { for (Object success : list) { System.out.println(userName + "(" + success.toString() + ")商品搶購成功,當前搶購成功的人數是:" + (1 - (num - 100))); } } } else { System.out.println(userName + "商品已經被搶完了"); } jedis.close(); } /** * 測試鏈接redis庫 * @param args */ public static void main(String[] args) { // 鏈接本地的 Redis 服務 Jedis jedis = new Jedis("192.168.17.128"); System.out.println("鏈接本地的 Redis 服務成功!"); // 查看服務是否運行 System.out.println("服務 正在運行: " + jedis.ping()); } }
測試啓動類以下java
package redis; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import redis.clients.jedis.Jedis; public class TestMs { public static void main(String[] args) throws InterruptedException { Jedis jedis = new Jedis("192.168.17.128"); jedis.set("iphone8","100"); jedis.close(); //玩多線程 ExecutorService executor = Executors.newFixedThreadPool(15); for(int i = 0 ; i < 1000; i++){ executor.execute(new SaleRunable("user" + i)); } executor.shutdown(); System.out.println("搶購完成!"); } }
開啓20個線程運行結果以下:
redis查看數據,還剩 27個。。
屢次模擬,數據在賣出80個左右浮動,開啓線程數越大,賣出的越少。。。redis
開啓15個及小於15個線程,結果以下,基本上能賣完,屢次運行偶爾會有1-2次賣出99個
redis數據庫數據
啥狀況呢?數據庫
源代碼地址:
https://www.cnblogs.com/longtaosoft/p/6627568.html
https://blog.csdn.net/lzh657083979/article/details/77917088多線程