作以前看了很多關於秒殺商品的文章,其中有一篇以爲很好:【問底】徐漢彬:Web系統大規模併發——電商秒殺與搶購redis
搶碼的邏輯比秒殺商品要簡單太多,雖然簡單可是高併發的問題卻仍是存在的,有幾個問題:
數據庫
如何保證不超發。併發
如何防止重複領取。負載均衡
如何防止用戶領取到同一個碼。異步
直接操做數據庫的作法:高併發
先查詢status爲0的紀錄,再更新:select id from codes where status = 0 limit 1;update codes set status = 1 where id = xxx and status = 0;
性能
上面的作法在高併發下會出現什麼問題呢?spa
形成多個用戶查詢到同一個碼。.net
update的時候會掃描全表。線程
開啓事務時先select後update可能會形成死鎖。
個人想法是加入Redis來提升高併發時的性能:
事先把碼放入redis隊列中
知足條件pop一個碼出來
爲何使用redis隊列?redis是單線程,這樣隊列出隊實際會是串行的操做,能夠避免超發和用戶 取到同一個碼 的問題,也解決了數據庫壓力。
總結:只是針對業務方面,實際運用的時候還會作一些負載均衡、限流、防刷的策略。若是併發過高向數據庫添加記錄的操做能夠異步來進行。