场景
每次需要生成n
个1~s
之间的随机整数
,并存入数据库,生成的随机数不能与数据库已有的数据重复
尝试过的思路
- 在代码中使用range生成含有1~s的集合,取出数据库中已有数据计算差集,对差集结果数组随机获取元素。
- 随机生成一个1~s的整数,并查询是否已存在于数据库中,如果已存在则重新生成随机数,直到成功取出需要的全部数据。
问题
由于数据量达百万级别,并且操作执行频率高,思路1的方法消耗性能资源太大,思路2又由于执行时间不可期,更不可取。
对于这种需求,是否有更合理的处理方式?
写一个我的思路,采用减法
我觉得你的s应该是一个固定的数吧,既然这样那么能出现的所有数据也已经固定下来了
比如s=1000000,那么1~1000000里的随机整数的全部可能也固定下来了
那么现在数据库里创1000000条数据,然后用户来拿一个数了,就全部取出来,然后随机一个整数出来,把这个数返给用户的同时给这个数在数据库里设置一个字段,比如used:true
下次用户来取的时候再从数据库里取全部数,不过要带上筛选条件,used不为true的,把取出的集合再随机一个数出来分配给用户,再把随机出来的数在数据库里设置一个相同字段,比如used:true
以此类推
这样应该不会存在重复的问题,开销的话也只是查一次数据库而已,比你的1,2应该都快
当然这个还有优化的空间,比如这个所有的数据也不一定存在数据库里啊,redis应该也更快,等等。我只是说下我的思路