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