首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 定時抽獎系統設計:Quartz + 隨機演算法實作指南

     編輯:程式設計疑難解答

需求分析

後台管理員設定開獎時間,到期自動從參與用戶中隨機抽取中獎者。技術棧:Java + Tomcat。

架構設計

  1. 排程觸發:採用 Quartz Scheduler 或 Spring @Scheduled(需配合資料庫鎖防止叢集重複執行)。
  2. 參與者快照:開獎瞬間鎖定參與名單(資料表加 status=1 或建立臨時表),確保公平性。
  3. 隨機抽取演算法:
    • 簡單版:Collections.shuffle(list) 後取前 N 筆。
    • 大數據版:水塘抽樣或一致性雜湊,避免全量載入記憶體。
    • 加權抽獎:根據用戶活躍度、等級賦予不同權重,使用「輪盤選擇」演算法。
  4. 結果持久化與通知:寫入中獎紀錄表,發送站內信/簡訊/推播通知。
  5. 冪等與補償:任務執行記錄表記錄執行狀態,支援手動重跑與失敗重試。

核心程式碼片段

@Scheduled(cron = "0 0 12 * * ?") // 每天中午 12 點執行
public void drawLottery() {
    List candidates = userRepo.findByActivityIdAndStatus(activityId, 1);
    Collections.shuffle(candidates);
    List winners = candidates.subList(0, prizeCount);
    winners.forEach(w => {
        w.setWinner(true);
        notificationService.send(w.getId(), "恭喜中獎!");
    });
    userRepo.saveAll(winners);
    lotteryLogRepo.save(new LotteryLog(activityId, LocalDateTime.now(), winners.size()));
}

關鍵注意事項

  • 資料庫唯一索引防止重複中獎。
  • 分散式環境下使用分散式鎖(Redis Redlock 或資料庫 SELECT FOR UPDATE)保證單次執行。
  • 抽獎過程記錄完整稽核日誌,滿足合規審計。

結語

定時抽獎系統的核心在於「時間觸發可靠、隨機演算法公平、結果可追溯」。採用成熟排程框架與經典隨機演算法,即可快速落地穩健的抽獎服務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved