我在面試別人的時候,經常會問對方,如何設計一個秒殺系統?回答的好的同學並不多,這裡我簡要說一下考察這個問題的目的.秒殺系統,那麼顧名思義就是搶購,庫存有限情況下的競爭問題,其實就是一個高併發的處理. 首先我們模擬不做併發處理的情況: 比如我們用戶一個庫存表 stock,庫存數量5 我們對外提供了一個 ...
我在面試別人的時候,經常會問對方,如何設計一個秒殺系統?回答的好的同學並不多,這裡我簡要說一下考察這個問題的目的.秒殺系統,那麼顧名思義就是搶購,庫存有限情況下的競爭問題,其實就是一個高併發的處理.
首先我們模擬不做併發處理的情況:
比如我們用戶一個庫存表 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