如何設(shè)計一個百萬級用戶的抽獎系統(tǒng)?
這個問題有點意思。但是你的問題過于籠統(tǒng),不好回答。
首先,你的抽獎名單數(shù)據(jù)是如何存儲的,還是一個全新的系統(tǒng),單純就是一個抽獎系統(tǒng)?一次抽獎多少個?
現(xiàn)在就說個比較簡單的情況,假設(shè):你的抽獎名單全部在一個表里面存儲,里面有一百萬條數(shù)據(jù),要一次性抽中500人。
我的設(shè)計思路就是:
首先利用循環(huán)把100萬條數(shù)據(jù)插入redis緩存服務(wù)器后,插入過程肯定是比較慢的,因為是從數(shù)據(jù)庫讀入到redis緩存。讀入完成后,再使用隨機函數(shù),隨機抽取[0-100)的整數(shù),直接通過index進行索引,快的時候,不用一秒就能命中數(shù)據(jù)。所以很輕松的解決了100萬數(shù)據(jù)的索引速度慢的問題。
下圖就是100w數(shù)據(jù)通過redis命中某條數(shù)據(jù)的速度,可參考以下:
命中了數(shù)據(jù)之后,為了防止重復(fù)命中,當(dāng)然同時應(yīng)該使用另外一個redis庫表存儲好命中的結(jié)果id,每抽一次數(shù)據(jù)就跟命中結(jié)果比較,存在則重新抽,直到500個不重復(fù)的數(shù)據(jù)抽滿為止。
最后把命中的結(jié)果更新到數(shù)據(jù)庫(如mysql server或者mssql server 等) 進行固化保存。
另外給你介紹一個我使用的redis工具,方便你參考處理:
redis 存儲的數(shù)據(jù)類型,可以是整數(shù),字符串,數(shù)組,json等,我下面用的是json,你可用key及value 均存儲用戶的id號即可:
下面存儲是數(shù)組:
具體如何安裝redis,可用百度一下,有window是版本,安裝過程也不復(fù)雜。
希望我的回答能幫到您!