使用Redis中間件解決商品秒殺活動中出現的超賣問題(使用Java多線程模擬高併發環境)

1、引入Jedis依賴java

能夠新建Spring或Maven工程,在pom文件中引入Jedis依賴:redis

<dependency>多線程

<groupId>redis.clients</groupId>架構

<artifactId>jedis</artifactId>併發

<version>2.9.0</version>高併發

</dependency>工具

2、Jedis工具類學習

JedisUtil.java測試

3、秒殺測試類(代碼模擬多用戶+高併發)線程

RedisSecKiller.java

注:關於多線程部分代碼的說明

傳統的方式是使用new Thread來建立、運行(start)線程,但那樣過低效了;使用定長線程池 + ExecutorService的execute方法來建立、運行線程,比前者高效得多。

4、運行結果

4.1 Redis數據插入結果

進入RedisManager -> db0查看

4.2 IDEA控制檯輸出結果

5、有趣的測試

5.1 用戶數量小於商品數量,且等於最大併發數

將RedisSecKiller類中的USER_NUM從100改成5,由於此時N_THREADS仍然爲5,最大併發數仍爲5,即有5個用戶同時在搶購10件商品。注意,只要最大併發數大於等於用戶數量,就會形成全部用戶同時搶購商品(高併發)的狀況出現。

運行結果以下:

5.2 用戶數量小於商品數量,且大於最大併發數

將N_THREADS從5改成3,此時有5名顧客搶購10件商品,但最多隻有三名顧客在同一時刻搶購。運行結果:

5.3 總結

(1)歡迎加入QQ羣架構華山論劍:836442475【點擊進入】(大牛彙集地)進個人私人羣討論技術和學習!

(2)由5.1和5.2對比可知,當用戶數量小於商品數量時,併發訪問量越大,用戶秒殺到商品的成功率就會越低,由於併發量越大,能夠進行的秒殺輪數就會越少,能搶購到商品的用戶也就越少。

(3)5.1和5.2中的假設實際上是不合理的,若是用戶數量小於商品數量,供大於求,那也就不該該存在高併發秒殺的概念了,即便此時強行製造秒殺這個概念,但由於庫存充足,因此也應該讓全部用戶都搶購到商品,只是搶到的前後順序不一樣而已。

一個真實的網上商城的秒殺活動應該存在以下關係:用戶數量(在線)>> 商品數量 > 用戶併發數,舉例:

由1W臺手機等待秒殺,在線等待秒殺活動開始的用戶數量爲10W,用戶併發量爲3k。

相關文章
相關標籤/搜索