Redis-秒殺

唉?就記得當時搶冰墩墩的時候的秒殺了

我們要注意什么問題呢?

1.幾百萬人在這個瞬間搶冰墩墩?這個瞬間會有大量的請求?服務器要能抗的住

2.不能超賣,就那些冰墩墩?賣多了壓根沒有?好不容易搶到你說沒貨了怕不是要被沖爛

3.避免少賣?攏共就那些?你再少賣點?沒屁了

4.防黃牛?還是那個道理?攏共就五百個?黃牛每人嗯造十個?沒了?

高并發問題

基本解決高并發的方法都是?削峰、限流、異步、補償

異步這一步可以通過消息隊列來實現,將搶和購解耦,還可以很方便地限頻,不至于讓MySQL過度承壓。搶的話使用Redis來做處理,因為Redis處理 簡單的扣減請求是非常快的,而直接到MySQL是比較力不從心。
Redis可是單機支撐每秒幾萬的寫入,并且可以做成集群,提高擴展能力的。我們可以先將庫存名額預加載到Redis,然后在Redis中進行扣減,扣減成功的再通過消息隊列,傳遞到MySQL做真
正的訂單生成。

超賣問題

第一步,判斷庫存名額是否充足;
第二步,減少庫存名額,扣減成功就是搶到。

用LUA把這兩個捆綁成一個原子操作就好

1.正常業務錯誤,比如庫存用完,這種情況符合預期,直接返回給用戶即可。
2.訪問Redis錯誤,這種情況返回給用戶,讓其重試即可
3.訪問Redis超時,這種情況下,其實可能庫存已經扣減成功,此時不用再重試,免費產生更多的無效扣減,雖然多了一次扣減,但是總數是不變的,只會少賣不會多賣。
?

?

少賣問題

少賣什么情況會出現呢?庫存減少了,但用戶訂單沒生成。
什么情況會這樣呢?有幾種可能:
1..上面提到的,減少庫存操作超時,但實際是成功的,因為超時并不會進入生成訂單流程;
2.在Redis操作成功,但是向Kafka發送消息失敗,這種情況也會白白消耗Redis中的庫存。

說白了,我們只需要保證Redis庫存+ Kafka消耗的最終一致性。
●第一種,也最簡單的方式,在投遞Kafka失敗的情況下,增加漸進式重試;?

(成功的可能性越來越小?他就越來越懶)
●第二種,更安全一點,就是在第一種的基礎上,將這條消息記錄在磁盤上,慢慢重試;
●第三種,寫磁盤之前就可能失敗,可以考慮走WAL路線,但是這樣做下去說不定就做成MySQL的undo log,
redo log這種WAL技術了,會相當復雜,沒有必要。
一般都用第二種

怎么解決黃牛呢

首先我們可以每個id限購一個

第一步查詢庫存,第二步扣減庫存,需要優化為第一步查詢庫存, 第二步查詢用戶己購買個數,第三步扣減庫存,第四步記錄用戶購買數。(用LUA保證原子性)
這里需要注意的是,如果使用Redis集群,那么Redis的數據分片,需要根據用戶來分Key,不然用戶數據會查詢不到。
有了限購,我們可以保證貨品不會被黃牛占據太多

那么還剩一個問題,黃牛大多是通過代碼來搶購,點擊速度比人點擊快得多,這樣就導致了競爭不公平。(我當時就是用了一個秒殺腳本?說實話?收獲甚微)
怎么解決呢?某個用戶請求接口次數過于頻繁,一般說明是用腳本在跑, 可以只針對該用戶做限制。
針對IP做限制也是常見做的做法,但這樣容易誤殺,主要考慮到使用同一個網絡的用戶,可能都是一個出口IP。 限制IP,會導致正常用戶也受到影響。
更好用的方案是加上一個驗證碼驗證。 驗證碼符合91原則(啊.....),90%的時間,都用在驗證碼輸入上,所以使用腳本點擊的影響會降到很低。


?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41511.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41511.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41511.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CentOS系統環境搭建(十五)——CentOS安裝Kibana

centos系統環境搭建專欄🔗點擊跳轉 關于Elasticsearch的安裝請看CentOS系統環境搭建(十二)——CentOS7安裝Elasticsearch。 CentOS安裝Kibana 文章目錄 CentOS安裝Kibana1.下載2.上傳3.解壓4.修改kibana配置文件5.授予es用戶權限6.kibana 后臺…

uniapp的UI框架組件庫——uView

在寫uniapp項目時候,官方所推薦的樣式庫并不能滿足日常的需求,也不可能自己去寫相應的樣式,費時又費力,所以我們一般會去使用第三方的組件庫UI,就像vue里我們所熟悉的elementUI組件庫一樣的道理,在uniapp中…

? Spring Clould 配置中心 - Nacos

視頻地址:微服務(SpringCloudRabbitMQDockerRedis搜索分布式) Nacos配置管理-Nacos實現配置管理(P24、P25) Nacos除了可以做注冊中心,同樣可以做配置管理來使用。 當微服務部署的實例越來越多&#xff0c…

18萬字應急管理局智慧礦山煤礦數字化礦山技術解決方案WORD

導讀:原文《18萬字應急管理局智慧礦山煤礦數字化礦山技術解決方案WORD》(獲取來源見文尾),本文精選其中精華及架構部分,邏輯清晰、內容完整,為快速形成售前方案提供參考。 目 錄 第一章 項目概述 1.1項目…

《Go 語言第一課》課程學習筆記(七)

代碼塊與作用域:如何保證變量不會被遮蔽? 什么是變量遮蔽呢?package mainimport ("fmt""github.com/google/uuid""github.com/sirupsen/logrus" )func main() {fmt.Println("hello, world")logrus.…

私域新零售商業模式成功的八大要素

從事互聯網行業多年以來,遇到客戶問最多的一個問題,就是什么樣的模式火呀?在設計一個商業模式時,不單單只是考慮資金和人脈等等資源的,其實還是需要遵循這八大原則,它包括:客戶價值最大化原則、…

PyTorch學習筆記(十三)——現有網絡模型的使用及修改

以分類模型的VGG為例 vgg16_false torchvision.models.vgg16(weightsFalse) vgg16_true torchvision.models.vgg16(weightsTrue) print(vgg16_true) vgg16_true.classifier.add_module("add_linear",nn.Linear(1000,10)) print(vgg16_true) vgg16_false.classifie…

C#學習,委托,事件,泛型,匿名方法

目錄 委托 聲明委托 實例化委托 委托的多播 委托的用途 事件 通過事件使用委托 聲明事件 泛型 泛型的特性 泛型方法 泛型的委托 匿名方法 編寫匿名方法的語法 委托 類似于指針,委托是存有對某個方法的引用的一種引用類型變量,引用可以在運…

vue中使用faker庫生成指定類型的隨機數據

介紹 Faker.js 是十分流行的 Node.js 工具庫,2022年初,Faker.js的作者突然刪庫跑路,導致眾多應用程序崩潰,為了繼續使用Faker的功能,社區的幾位開發者組成團隊決定創建并維護新項目faker-js/faker,現其已成…

Docker+Selenium Grid搭建自動化測試平臺

安裝docker yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager –add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install docker-ce -y Create a Docker Network docker network create grid 下載鏡像 hu…

laravel-admin之 解決上傳圖片不顯示 $form->image(‘image‘); 及 $grid->column(‘image‘);

參考 https://blog.csdn.net/u013164285/article/details/106017464 $grid->column(‘image’)->image(‘http://wuyan.cn’, 100, 100); // //設置服務器和寬高 圖片上傳的域名 上傳的圖片不顯示 在 這里設置了圖片的上傳路徑 在這里設置 域名 就可以回顯圖片

【計算機視覺|生成對抗】帶條件的對抗網絡進行圖像到圖像的轉換(pix2pix)

本系列博文為深度學習/計算機視覺論文筆記,轉載請注明出處 標題:Image-to-Image Translation with Conditional Adversarial Networks 鏈接:Image-to-Image Translation with Conditional Adversarial Networks | IEEE Conference Publicati…

如何學習正則表達式

正則是什么,能做什么? 正則,就是正則表達式,英文是 Regular Expression,簡稱 RE。顧名思義,正則其實就是一種描述文本內容組成規律的表示方式。 在編程語言中,正則常常用來簡化文本處理的邏輯…

Android DataStore:安全存儲和輕松管理數據

關于作者:CSDN內容合伙人、技術專家, 從零開始做日活千萬級APP。 專注于分享各領域原創系列文章 ,擅長java后端、移動開發、人工智能等,希望大家多多支持。 目錄 一、導讀二、概覽三、使用3.1 Preferences DataStore添加依賴數據讀…

LVS負載均衡集群-NAT模式部署

集群 集群:將多臺主機作為一個整體,然后對外提供相同的服務 集群使用場景:高并發的場景 集群的分類 1.負載均衡器集群 減少響應延遲,提高并發處理的能力 2,高可用集群 增強系統的穩定性可靠性&…

封裝vue2局部組件都要注意什么

一. 關于局部組件組成的三個部分&#xff08;template, script, style&#xff09; template > 組件的模板結構 &#xff08;必選&#xff09; 每個組件對應的模板結構&#xff0c;需要定義到template節點中 <template><!-- 當前組件的dom結構&#xff0c;需…

Java SPI加載機制

SPI加載機制 SPI&#xff08;Service Provider Interface&#xff09;是一種通過外界配置來加載具體代碼內容的技術手段。SPI是JDK內置的一種服務提供發現機制&#xff0c;用于實現框架的擴展和組件替換。 在SPI中&#xff0c;框架提供一整套接口&#xff0c;使用者實現這些接…

React源碼解析18(8)------ 實現單節點的Diff算法

摘要 經過之前的幾篇文章&#xff0c;我們已經實現了一個可以進行更新渲染的假React。但是如果我們把我們的jsx修改成這樣&#xff1a; function App() {const [age, setAge] useState(20)const click function() {setAge(age 1)}return age % 2 0 ? jsx("div"…

學習紅外成像儀開發注意要點

學習紅外成像儀開發注意要點 三河凡科科技飛訊紅外成像儀開發學習注意要點 紅外成像儀是一種高級的光學設備&#xff0c;可用于探測、分析和顯示紅外輻射&#xff0c;它廣泛應用于醫學、軍事、石油、礦產資源勘探等領域。紅外成像儀的開發需要注意以下幾個方面&#xff1a; 1…

(搜索) 劍指 Offer 12. 矩陣中的路徑 ——【Leetcode每日一題】

?劍指 Offer 12. 矩陣中的路徑 難度&#xff1a;中等 給定一個 m * n 二維字符網格 board 和一個字符串單詞 word 。如果 word 存在于網格中&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 單詞必須按照字母順序&#xff0c;通過相鄰的單元格內的字母構…