C# 秒殺物品,程序如何控制並發?
02-14
現在要做一個活動,活動中有一個獎品,要對它做定時秒殺,請問下程序如何控制並發不會讓資料庫卡死,並且保證活動頁不會出現卡死
如果只有一個獎品,那直接寫內存就好了,秒成功了再寫進資料庫。
收到第一個請求之後就關閉前端的入口,把所有收到的請求都緩存在內存里,根據時間排序,選最早的中獎。
不設置獎品就對了,提前設定好中獎人。
我不會傻到告訴你global里可以放靜態變數的
無聊想了個秒殺的架構設計 以前寫的一篇,拿去看吧。
核心思路就是通過redis實現排隊功能,剔除不符合的用戶,減少資料庫壓力。
切記使用cache。
頁面的每次請求都寫資料庫,資料庫就爆了,啥資料庫都不好使。你先開闢一個內存空間。
然後使用這個內存空間保存資料庫裡面取出來的內容,變成一個對象。然後進行操作,注意操作積累,積累到一定程度就update cache,回寫資料庫,回查資料庫。更高端的還可以實現多線程cache,讀的快,寫得慢。不過不適合秒殺這種實時性比較強的程序。
緩存。切莫直接讀寫資料庫。
除了語句的優化,Nosql、Memcache準備,為了活動不可能買負載均衡器;所以活動上線先做下壓力測試吧
就一個獎品一台機器控制只發出一個db請求就可以了,你有多少台機器能把db跑垮?
直接用原子變數,在內存操作。不要直接走資料庫
我現在的思路是,客戶端每調用一次介面,我會將用戶寫入Redis,緩存中的用戶&<=數量*2 後,客戶端再調用介面直接return,獎品數量為0後程序自動清楚此緩存。windows服務會自動同步將緩存中的用戶寫入資料庫,獎品與用戶綁定成功的寫入緩存,客戶端請求此緩存介面。
推薦閱讀:
※微軟究竟遇到了什麼問題使得他們到現在都無法在 C1 中實現兩步名稱查找?
※你有什麼關於Linux下C++並行編程的好書和經驗跟大家分享?
※GCC 4 編譯警告:warning: dereferencing type-punned pointer will break strict-aliasing rules 有什麼比較好的解決辦法?
※編譯 C++ 項目時模板引發的「undefined reference to」問題?
※語句str2= str1 + (str1.size() - 1," ")為什麼只有1個空格添加進去了?