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

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

首先咱們模擬不作併發處理的狀況:前端

好比咱們用戶一個庫存表 stock,庫存數量5面試

 

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

 

 

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

 

咱們重開一個控制檯程序,模擬10個線程併發併發

 

 

能夠看到,咱們成功了7次,而庫存只有5個,說明咱們超賣了2個.異步

 

 

那麼要如何解決這個併發問題呢?高併發

很簡單能夠利用redis的原子性,讓redis把無效的請求遮擋掉.net

 

 

 

 

 這樣就沒有併發問題了.線程

 

這裏講解下什麼是redis的原子性:

 

 

 

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

 

二、Redis的單線程處理全部的客戶端鏈接請求,命令讀寫請求。(有些任務好比rdb和aof等操做是fork子進程處理的,不會影響redis主線程處理客戶端的命令)

 

三、Redis提供的全部API操做,相對於服務端方面都是one by one執行的,命令是一個接着一個執行的,不存在並行執行的狀況。

 

 

擴展閱讀:

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

相關文章
相關標籤/搜索