秒殺系統面試

如何解決超賣問題?大致思路

1.在sql上加上判斷防止數據庫邊界爲負數

2.數據庫加上唯一索引防止用戶重複購買

3.redis預減庫存減少數據訪問,內存標記減少redis訪問,請求先入隊列緩衝,異步下單

 

具體實現?

1:將庫存從mysql移到redis,將所有的寫操作放到內存,由於redis不存在鎖所以不會出現相互等待,並且由於redis的寫性能和讀性能遠高於mysql,解決的性能問題,然後通過隊列等異步手段,將變化的數據寫到數據庫中

優點:提高性能

缺點:沒有解決超賣問題,同時由於異步寫入db,所以可能會出現數據庫緩存不一致的情況

2:引入隊列,讓所有寫db操作在單隊列中排隊,變爲串行處理。當庫存到達閥值時就不進入消費隊列,並關閉購買功能,解決了超賣問題

優點:解決了超賣問題

缺點:性能受限於隊列中處理性能和db寫入性能中最短的那個,如果多個商品搶購需要準備多條隊列

3:採用redis中的分佈式鎖來解決超賣問題,要麼是setnx,expire的原子方式,要麼用redisson。

redis分佈式鎖怎麼優化?

分段加鎖,把數據分成很多段,每個段加單獨的鎖,就是把總庫存拆分開拆成分庫存,每個分庫存都有一把鎖

 

rabbitmq怎麼做到消息不重複不丟失即使服務器重啓?

1.消息持久化

2.隊列持久化

3.發送消息時設置消息模式是持久化

4.手動確認

 

 

高併發情況下的秒殺系統?

   前端進行頁面緩存,然後對同一個uid限制它的訪問頻率

   服務端用上請求隊列,每次只有有限的寫請求能夠去到數據層,如果都成功,再放下一批請求進來,否則返回已結束

   對於訪問請求用上redis,將秒殺的商品信息緩存在redis裏,由於redis基於內存的操作,性能非常高,所以能夠抗住高併發下的讀請求,如果單機redis不行,那麼就對redis做集羣

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章