IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

抽奖类活动项目的一些技术Tips

heiyeluren的Blog 2014-04-07 22:24:29 累计浏览 2,416 次
本机暂存

   抽奖类活动项目的一些技术Tips:

   背景:

   一般互联网产品为了拉升人气等,会有各种运营活动,活动一般会发实物奖品,就会吸引很多用户来抽奖,当然里面也会混杂很多专业刷奖的人,他们关注各个公司的抽奖活动以刷奖为生,所以我们的抽奖系统一定要设计的符合这种实际情况才安全,否则把奖品发超了,引来用户投诉吐槽,说明代码写的不到位,会影响技术人员的光荣伟大正确的形象的。(奖品内定或者程序里埋雷不属于本讨论范畴)

   Tips:

   1. 接入层

   反作弊要做的合理恰当,要限制某个ip某个用户抽奖的次数,特别是ip,比如一天只能抽几次,或者每次花费多少积分之类的,防止被刷奖;抽奖限制最好使用缓存而不是数据库来存储限制值,因为db太慢,用户并发几百上千的请求来的时候,你数据都还没到db,db先挂了。

   2. 代码层

   不要用复杂的抽奖算法,因为不可控,只做最简单的抽奖算法,包括策略比例都最简单,适当的把一些抽奖策略放到配置里面。实际发奖这件事儿把这件事丢给db做,一般代码层干的事儿就是过滤掉大部分想得到奖品的请求,然后把小部分有机会进入获奖途径的人放入db,然后再db层随机某个奖池出奖;

   3. 数据层

   数据层按照奖池的模式来设计,比如一天发放多少个奖品,就用定时程序每天凌晨0点把今天要发的奖品都初始化到db里,然后变成今天的奖池。还有一定要注意奖品数量数据类型,对于奖品数量这种字段,务必使用有符号整形(千万切记不要使用无符号整形,否则你在针对这些字段做减少操作的时候,可能溢出变成21亿,就完蛋了。

   还有就是要给数据加锁,一般在一个奖品变化的时候,直接使用事务的方式进行调整,然后把事务隔离级别调高,基本就能保证一个字段数据同时只能一个session进行操作,保证奖品数据不会异常。再进行减少奖品数量的时候,务必判断奖品数量是否大于0,类似:update xxxx set total = total - 1 where total > 0; 如果不放心,可以适当使用 for update 保证串行执行更新操作。

   4. 测试

   线下最好做压力测试,因为用户会刷你,你要看看代码是否坚强可靠,最好的办法就是做压力测试

   5. 其他

   奖品发放一般建议白天,因为晚上刷奖的人比较多,所以在奖品设置的时候,最好晚上阶段就不怎么放奖品,省得出问题半夜起来解决问题。另外,最好奖品发放能够细化到每个时间点,比如说A奖品分别在每两个小时放一个,这个发放时间最好是比较固定的,这样才可控,千万不要什么概率随机算法之类的给自己添堵。

   还有奖品发放的上下游记录要清晰,哪个IP、什么时候、获得某个奖品,然后建议奖品获得后不要着急给用户快递,最好能够有一些审计,比如说某个IP获得多个奖品,那就可能是刷的。

   所以为了保障期间,所有活动说明都需要明确表示出最终解释权归活动主办方(不过这个貌似国家有规定不能这么说),反正要留下足够多的回旋空间,给抽奖程序出问题或者抽奖规则变化留下空间。

同分类推荐文章

  1. 绿盟科技《APT组织研究年鉴》(2026 版)正式发布 (2026-06-16 20:21:10)
  2. 【已复现】Linux内核Fragnesia权限提升漏洞(CVE-2026-46300) (2026-06-15 10:53:58)
  3. 企业文档安全最佳实践(二):给文档上“身份证”——手动标密与智能自动标密 (2026-06-12 17:18:33)

查看更多 安全 文章 →

建议继续学习

  1. 深入浅出INNODB MVCC机制与原理 (累计阅读 9,692)
  2. 一个典型支付系统的设计与实现 (累计阅读 9,155)
  3. MySQL锁管理(并发锁,行锁,表锁,预加锁,全局锁等等) (累计阅读 5,902)
  4. InnoDB线程并发检查机制 (累计阅读 5,794)
  5. Squid 限制用户并发连接数 (累计阅读 5,237)
  6. 使用nginx限制蜘蛛的频繁抓取 (累计阅读 4,499)
  7. 多版本并发控制(MVCC)在分布式系统中的应用 (累计阅读 4,134)
  8. 几个随机算法 (累计阅读 3,647)
  9. InnoDB线程并发检查机制 (累计阅读 3,599)
  10. 概率选取的实现 (累计阅读 3,576)