随机分配抽奖码问题

JerryZhou_ 2019-07-10 04:00:47
大致需求是这样:
数据库有一个表,生成了1万个(后面更多)唯一抽奖码,用户点击抽奖的时候会分配一个抽奖码,要求每个用户拿到的不一样,用户每拿到1个抽奖码之后会把抽奖码的状态改为已使用之类的,在没有大量并发的情况下是正常使用的,现在就是考虑并发的情况下可能两个用户拿到的是一个抽奖码,想听听大伙的解决方案,谢谢。。
...全文
342 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
鸟与鱼 2019-08-06
  • 打赏
  • 举报
回复
用数据库乐观锁,加版本号,加一个version字段,每次都先查询,更新的时候只有版本号一致才更新,否则更新失败,当多个用户取到同一条数据的时候,只有一个用户能够更新成功,其他更新失败
牧歌ing 2019-07-24
  • 打赏
  • 举报
回复
可不可以先全部存redis,取一个删一个,然后再更新数据库
JerryZhou_ 2019-07-22
  • 打赏
  • 举报
回复
目前用的是 存储过程实现的;因为涉及业务逻辑比较多。各种修改新增语句; redis也考虑了,有个问题就是,如果1万个抽奖码(后面会更多)都缓存在redis里面,如果做到和数据库很好地同步呢?
qq_28068487 2019-07-17
  • 打赏
  • 举报
回复
首先,讲一下纯数据库如何实现,使用乐观锁(抽奖码状态),每次读取第一条未使用的数据,修改的时候 抽奖码ID + 状态=未使用 做为修改条件,这样可以解决脏读的问题,如果修改失败,则证明该抽奖码已经被使用,重复读取-修改操作 直到修改成功

考虑性能,可以使用redis 缓存 抽奖码
豫让_______ 2019-07-16
  • 打赏
  • 举报
回复
引用 2 楼 水边2 的回复:
上面的方案1使用了数据库的锁机制,只保证数据分配唯一性,不保证并发;

方案2可以在队列pop 1万次后,后续进入的用户全部失败,对数据库压力小一些,但是引入了mq,复杂度高了。

不用mq用redis也可以的,2个队列,一个存未被抽取的,一个存已抽取未落db的,pop队列时检验动态维护队列大小,避免构造太大的队列。
游北亮 2019-07-11
  • 打赏
  • 举报
回复
上面的方案1使用了数据库的锁机制,只保证数据分配唯一性,不保证并发; 方案2可以在队列pop 1万次后,后续进入的用户全部失败,对数据库压力小一些,但是引入了mq,复杂度高了。
游北亮 2019-07-11
  • 打赏
  • 举报
回复
几个方案: 1、只用数据库: while(true){ 获取一个码a update tb set status=已使用 where 码=码a and status=未使用 if(更新成功)break; } return 码a 2、增加队列 初始化:把一万个码全部放入队列里。 抽奖: 码a = 队列.pop(); update tb set status=已使用 where 码=码a and status=未使用 if(更新成功)return 码a
asp+access公众号用通用领系统 一个用户发送相同指令即时领取一条记录,被领取后其他人不可领取。 注意:关注用户无差别回复,注意识别一个用户多个号关注等现象。 注意:领取用途请勿设置成随机回复:1个奖项会被回复给多人。 举例1 激活随机发放: 一列是指令,第二列是游戏卡密或优惠券等内容 发送指令随机回复指令对应的多条结果之一给发送者一人。 发送者再次发送相同指定回复之前内容,该条结果也不再回复其他人。 举例2:帐号密随机发放 一列是指令,第二列是账号密 发送指令随机回复指令对应的多条结果之一给发送者一人。 发送者再次发送相同指定回复之前内容,该条结果也不再回复其他人。 举例3:小型抽奖类用途: 以一等奖1个二等奖2个共20人抽奖为例:一共20行,一行一等奖,两行二等奖,其他行17行内容是[未中奖] 指令列一样,比如ling,前1-20人发送指令,每人随机得到一行(条)内容,之后其他人发送提示领取已结束。 举例4:小型秒抢用途: 以一等奖1个二等奖2个:一共3行,一行一等奖,两行二等奖 指令列一样,比如qiang,前3人随机得到一等奖二等奖,之后其他人发送提示结束; 举例5:抽签分配用途: 以200学生随机分5个班为例:两百行回复内容, 各班都是40行(可自由波动)。 200位家长发送统一的指令比如fenban,各用户随机得到分班结果。 注意:关注用户无差别回复,注意识别一个用户多个号关注现象。 规则强调: 1. 只有关注公众号的某信用户才可以发送指令:需要你有某信公众号(订阅号也可)。 2. 随机领取:用户只能领取一次(以后发送提示之前领取的号)。 3. 本系统不验证用户信息,关注用户无区别对待。

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧