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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM