1. 程式人生 > 實用技巧 >tp5.1結合topthink-queue實現秒殺@ShineYork

tp5.1結合topthink-queue實現秒殺@ShineYork

1.什麼是秒殺
秒殺活動是一些購物平臺推出的集中人氣的活動,一般商品數量很少,價格很便宜,限定開始購買的時間,會在以秒為單位的時間內被購買一空。比如原價千元甚至萬元的商品以一元的價格出售,但數量只有一件,在某天的某個時間開始出售,這就造成很多人去搶這一件商品。當然想搶到是需要很多因素的,比如你的電腦配置、網速,還有你的運氣。

2.秒殺會帶來的問題
1、高併發
  比較火熱的秒殺線上人數都是10w起的,如此之高的線上人數對於網站架構從前到後都是一種考驗。

2、超賣
  任何商品都會有數量上限,如何避免成功下訂單買到商品的人數不超過商品數量的上限,這是每個搶購活動都要面臨的難題。
3.解決的方式
前臺:
A:擴容
  加機器,這是最簡單的方法,通過增加前端池的整體承載量來抗峰值。
B:靜態化
將活動頁面上的所有可以靜態的元素全部靜態化,並儘量減少動態元素。通過CDN來抗峰值。
C:限流
一般都會採用IP級別的限流,即針對某一個IP,限制單位時間內發起請求數量。或者活動入口的時候增加遊戲或者問題環節進行消峰操作。

//……….

後臺:
A: 鎖機制

樂觀鎖,就是在資料庫設計一個版本號的欄位,每次修改都使其+1,這樣在提交時比對提交前的版本號就知道是不是併發提交了,但是有個缺點就是隻能是應用中控制,如果有跨應用修改同一條資料樂觀鎖就沒辦法了,這個時候可以考慮悲觀鎖。
悲觀鎖,就是直接在資料庫層面將資料鎖死,類似於oralce中使用select xxxxx from xxxx where xx=xx for update,這樣其他執行緒將無法提交資料。

B: redis佇列

引入佇列,然後將所有寫DB操作在單佇列中排隊,完全序列處理。當達到庫存閥值的時候就不在消費佇列,並關閉購買功能。這就解決了超賣問題。
優點:解決超賣問題,略微提升效能。
缺點:效能受限於佇列處理機處理效能和DB的寫入效能中最短的那個,另外多商品同時搶購的時候需要準備多條佇列。

//……….

4.準備工具
測試工具壓力測試工具ab或者jmeter- 這裡我們會使用jmeter
更多的請求看這裡 https://blog.csdn.net/moonpure/article/details/72674374

Redis工具的安裝,以及redis的擴充套件安裝

Jmeter:

這是一個綠色的工具,但是它需要依賴與jdk 8的環境,所以在安裝的時候需要安裝jdk8。

雙擊就可以安裝,安裝之後把
C:\Program Files (x86)\Java\jre1.8.0_181\bin
這個地址配置到環境變數中

然後cmd即可出現如下內容則ok

接下來解壓它

解壓之後 apache-jmeter-5.0\apache-jmeter-5.0\bin

找到這個jmeter.bat雙擊執行
出現這個介面就ok

但是在第一次開啟的時候其實是一個英文的
設定預設為中文 則可以修改jmeter.properties 新增language=zh_CN

滑鼠右鍵-》選擇執行緒組

執行緒數就是使用者量
Ramp-Up period指的是每個執行緒間隔多長時間,如果設定為0,就是併發;

選擇http請求

填寫測試的介面

這是展示不同的結果內容,就是測試之後的情況

其他相關使用看這個網址 https://www.hissummer.com/

Redis
https://github.com/MicrosoftArchive/redis/releases/tag/win-3.2.100

下載之後雙擊安裝,同時配置環境變數
然後redis要安裝成功

執行redis-server redis.windows.conf出現如下內容也是沒有關係

只需要執行redis-cli有結果則安裝成

安裝php-redis擴充套件
1.使用phpinfo()函式檢視PHP的版本資訊,這會決定擴充套件檔案版本。
2.下載php_igbinary-1.2.1-5.5-ts-vc11-x64.zip,php_redis-2.2.5-5.6-ts-vc11-x64.zip(一定要保證版本的正確性)
下載地址:
http://windows.php.net/downloads/pecl/snaps/redis/2.2.5/
http://windows.php.net/downloads/pecl/releases/igbinary/1.2.1/

3.解壓縮後,將php_redis.dll和php_redis.pdb拷貝至php的ext目錄下
4.修改php.ini,(PS:此php.ini檔案是在Apache目錄)在該檔案中加入:

; php_redis
extension=php_igbinary.dll
extension=php_redis.dll
注意:extension=php_igbinary.dll一定要放在extension=php_redis.dll的前面,否則此擴充套件不會生效
5.重啟Apache後,使用phpinfo檢視擴充套件是否成功安裝

Redis的特點:
redis是單執行緒
1.效能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
2.豐富的資料型別 – Redis支援二進位制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 資料型別操作。
3.原子 – Redis的所有操作都是原子性的,意思就是要麼成功執行要麼失敗完全不執行。單個操作是原子性的。多個操作也支援事務,即原子性,通過MULTI和EXEC指令包起來。
4.豐富的特性 – Redis還支援 publish/subscribe, 通知, key 過期等等特性。

Redis能實現秒殺的重要因素:
使用redis佇列,因為pop操作是原子的,即使有很多使用者同時到達,也是依次執行

同時下載好元件think-queue
composer require topthink/think-queue