淺談秒殺系統中的庫存控制


  我在面試別人的時候,經常會問對方,如何設計一個秒殺系統?回答的好的同學並不多,這里我簡要說一下考察這個問題的目的.秒殺系統,那么顧名思義就是搶購,庫存有限情況下的競爭問題,其實就是一個高並發的處理.

首先我們模擬不做並發處理的情況:

比如我們用戶一個庫存表 stock,庫存數量5

 

 我們對外提供了一個接口供前端調用,

 

 

這個接口,只是簡單的判斷了庫存數量是否大於0,如果小於0則返回失敗.

 

我們重開一個控制台程序,模擬10個線程並發

 

 

可以看到,我們成功了7次,而庫存只有5個,說明我們超賣了2個.

 

 

那么要如何解決這個並發問題呢?

很簡單可以利用redis的原子性,讓redis把無效的請求遮擋掉

 

 

 

 

 這樣就沒有並發問題了.

 

這里講解下什么是redis的原子性:

 

 

 

1、Redis是單進程單線程的網絡模型,用的是epoll網絡模型,網絡模型都是單線程異步非阻塞處理網絡請求

 

2、Redis的單線程處理所有的客戶端連接請求,命令讀寫請求。(有些任務比如rdb和aof等操作是fork子進程處理的,不會影響redis主線程處理客戶端的命令)

 

3、Redis提供的所有API操作,相對於服務端方面都是one by one執行的,命令是一個接着一個執行的,不存在並行執行的情況。

 

 

擴展閱讀:

https://www.cnblogs.com/lori/p/9300087.html

 


免責聲明!

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



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