有 N 个 球 ( 百万个 )放在仓库 ,每次会有 M 个 (< 10 个) 同学会逐个进入操场中 ,这时候需要从仓库中取出球来给这些同学们玩 ( 每个同学完成各自指定量的球后,自动退场) , 每个球会给在场的同学们传递一遍(如果传球过程中,其中一个同学 之前传过这个球,就跳过这个同学,直接传给下一个同学),然后扔掉 ,并且记录下每个同学传过哪些球 。
从仓库取球时 ,需要计算后,优先取出所有在场同学都没有玩过的球 ; 如果不存在在场同学都没玩过的球,则尽量取出没被在场同学玩过的球
Redis 存储
存储所有的球用 SET , key 为 all_balls , value 为 ball_id ;
存储 每个同学玩过的记录也各自用一个 SET , key 为 stu:idm:balls , value 为 ball_id 。每个同学传递过一次球后, SADD 一次 。
当 id 为 1 同学进场时 ,在 Redis 中,执行
SDIFFSTORE all_stu_can_play_balls all_ball stu:id1
all_stu_can_play_balls
为 key 的 SET 用来存储在场同学都能玩的球集合
当 id 为 m 的同学进场时 ,在 Redis 中,执行
SDIFFSTORE all_stu_can_play_balls all_ball stu:idm:balls
key 为 all_stu_can_play_balls
更新为 最新的能被所有在场同学试玩的球 id 的 SET
当 id 为 m 的同学传递一次球后, 在 Redis 中 ZADD 一次
当 id 为 m 的同学完成其指定的传递次数后,退场时 ,挨个用 all_balls 对在场同学的 stu:idm:balls 执行 SDIFFSTORE ,重新计算 all_stu_can_play_balls 。
即 完成了取出能被所有在场同学玩的球 ,但是如果 all_stu_can_play_balls 被所有同学都试玩了后,如何取到 尽量多能被在场同学玩的球呢?
上面这个不完整方案只是抛砖引玉,还请各位 v2er 完善或者提出更优完整的方案
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.