摘要:秒殺接下來是關鍵的一步,使用的是的命令獲取商品,利用的是的原子性。好的方面是秒殺成功的數量是準確的,沒有超賣。參考資料實現高并發下的搶購秒殺功能基于云原生的秒殺系統設計思路秒殺架構設計
導語
秒殺想必大家都了解,在短時間內請求訪問會激增,同時要保證不會超賣和數據的準確,對于技術方面還是有些考驗的。可惜的是,一直沒有機會在項目中實現。再看了一些資料后,打算實驗下。以下代碼僅為測試所用,環境比較簡單,請根據實際情況進行修改。
創建秒殺隊列在開始秒殺之前,先將商品放入隊列中,如下
/** * 創建秒殺列表 */ public function createList() { $count = 30; $redisKey = "goods_list"; for ($i = 1; $i <= $count; $i++) { // 測試用,防止數據錯誤 if (Redis::llen($redisKey) >= $count) { break; } Redis::rpush($redisKey, $i); } }
執行完后,在 Redis 中看下
有 30 個商品 ID,數據正常。
秒殺接下來是關鍵的一步,使用的是 Redis 的 lpop 命令獲取商品 ID,利用的是 Redis 的原子性。
/** * 秒殺 */ public function buy() { // 隨機用戶名,無意義,僅做標記 $username = Hash::make(now()); if ($goodsId = Redis::lpop("goods_list")) { // 購買成功 Redis::hset("buy_success", $goodsId, $username); } else { // 購買失敗 Redis::incr("buy_fail"); } }
如上,簡化了代碼,購買之后,成功與否只是做記錄。實際應用中,當然會更加復雜,但要注意的是,不要同步操作 Mysql。多說一句,Hash:make(now()) 即使值相同,也不會生成相同的數據,參考這里。
測試最后就是進行測試了,使用 ab 測試,執行 ab -c 300 -n 3000 http://localhost/buy/ ,上述命令的意思是 300 并發,共請求 3000 次
執行完成,速度并不快,并且還有 794 個訪問失敗。來看下數據是否正確吧。在頁面中打印 buy_success 值
30 個成功者。再來看下秒殺失敗的數量
不是一個準確的數字,2165+30 是所有請求成功的數字,再加上失敗的 794 ,總數是 2989,依然不足 3000。
結語上述測試有不足的地方,響應速度慢、請求失敗、失敗計數不準確。看來有很多要優化的地方,不止是代碼層。測試的時候忘記將訪問記錄入庫關掉,應該是有些影響。
好的方面是秒殺成功的數量是準確的,沒有超賣。
重新配置了環境, 測試了同樣的代碼。不同的地方是增加了每次訪問判斷是否在黑名單(實時查詢 MySQl),而訪問記錄改成了隊列寫入 MySQL。結果如下
對比來看還是有所提升的。最主要的是數據終于是正確的,訪問失敗 355,搶購成功 30,搶購失敗 2615(忘記截圖了),相加總數正好是請求總數。而且 MySQL 中記錄的訪問記錄也是 3000。
參考資料:Redis實現高并發下的搶購、秒殺功能、基于云原生的秒殺系統設計思路、秒殺架構設計
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31233.html
摘要:在大流量程序開發中,必然會遇到高并發的應用的場景。樂觀鎖實現秒殺功能它的優點如下消息隊列對內存消耗較大,個請求,需要操作出隊列。需要結合實際的業務場景嵌入本文的核心實現邏輯。 在大流量程序開發中,必然會遇到高并發的應用的場景。解決方案大致分為兩個方向,消息隊列、鎖 redis 實現消息隊列核心簡單版本 $key = quque; /** ...
摘要:一為什么難秒殺系統難做的原因庫存只有一份,所有人會在集中的時間讀和寫這些數據。又例如搶票,亦與秒殺類似,瞬時流量更甚。 一、為什么難 ????秒殺系統難做的原因:庫存只有一份,所有人會在集中的時間讀和寫這些數據。例如小米手機每周二的秒殺,可能手機只有1萬部,但瞬時進入的流量可能是幾百幾千萬。又例如12306搶票,亦與秒殺類似,瞬時流量更甚。 主要需要解決的問題有兩個: 高并發對數據庫...
閱讀 3952·2021-11-24 09:38
閱讀 1421·2021-11-19 09:40
閱讀 2778·2021-11-18 10:02
閱讀 3691·2021-11-09 09:46
閱讀 1765·2021-09-22 15:27
閱讀 3110·2019-08-29 15:24
閱讀 997·2019-08-29 12:40
閱讀 1683·2019-08-28 18:24