我们首先对业务场景进行定义,如何快速的从 1000w 数据中找到 10 个数据作为中奖用户,重复100次,每次作为我们终将的名单,切每一个用户不能重复中奖。基于这个过程我们如何把这个过程高效的实现呢?
使用数据库是最直接的方法,但在处理大规模数据时,性能可能成为瓶颈。
select id from User where status=0 order by rand() limit 10
update user set status=1 where id in(...)
使用Set数据结构来存储中奖用户,可以提高抽奖效率。具体实现如下:
sadd usrlist uuid1
sadd usrlist uuid2
spop usrlist 10
在使用redis方案时候,需要考虑一下问题:
对于上面几个问题我们分别来看: