1当需求量大,促销节为零时,从关注的用户中选出N人发放礼物。同一用户不能重复参与,不允许两次中奖倒排很可能很酷。2.2随机选择N次SQL效率不错,但是需要先后执行两条SQL,并发运行时存在原子性问题,RAND函数不能保证不会重复中奖。offset=SELECTFLOOR(RAND()*COUNT(*))ASoffsetfromfollowusertableselect*fromfollowusertablelimitoffset,12.3RedisSet随机弹出step1:用户关注直播间写入MySQLfollowuser表时,然后添加一个userlist,设置到Redis中,用来存储用户号。可以保证用户的全局唯一性(避免用户重复注销和关注影响数据记录),数据基于Hash进行乱序存储,直接取出随机值。sadduserlistxxxid预计是long类型的用户号,100万用户50MB,1000万用户只有500MB。Step2:抽奖时,直接使用spop弹出100个随机用户号。这个操作是原子的,先弹出再返回,加上单线程的Redist命令队列,所以不存在并发问题,杜绝重复中奖。Step3:执行一次selectin提取数据,因为都是通过主键提取,效率快,不存在in索引失效的问题,但是需要注意in的个数上限为1000,超过1000个备选方案必须拆分成多个in.2.4PureRedis在内存够用,钱不差的情况下可用。因为抽奖结果页面通常只显示用户的昵称,所以也可以使用Rdis加速,用内存交换时间。sadduserlist'123456:ikun'sadduserlist'123456:akun'sadduserlist'123456:bkun'估计上千万用户需要3G内存,spop提取速度可以控制在3ms以内不重复。Redis不怕key多,就怕key大。测试结果:1000次pop的执行时间为2565,即每次pop只需要2.5ms。
