通过带参数的二维码实现病毒式推广,增加微信公众号的关注用户数量。在指定日期内的前10名用户可以获得指定奖品。需求详情:
- 每个用户进入活动页面,会显示自己的排名和已邀请人数,以及前10名的排名信息。
- 排名逻辑:先按邀请人数排名。如果人数相同,则按达到此数量的时间的先后顺序进行排序,先达到者排名靠前。
- 已关注的用户扫码不算邀请人数。
- 使用Redis的
Sorted Set
记录用户的有效邀请人数。(键名:subscribe_score
) - 使用Redis的
Hash
存储记录用户最新的有效关注动作的时间。(键名:subscribe_time
) - 当用户产生扫码事件后微信会发送消息到开发者服务器。如果是根据规则判定是有效关注动作,则将
subscribe_score
中该用户的关注人数增加1,同时更新subscribe_time
里该用户的最新关注动作的时间。 - 前10名排名算法:
- 从
subscribe_score
获得分数最高的前10名用户。 - 从
subscribe_score
获得第10名分数相同的所有用户,与前10名用户数据合并。 - 将前两步的结果进行两次排序:按人数降序,按时间升序。
- 取第3步排序后的结果的前10名。
- 从
- 10名以外用户获得自己排名信息的逻辑:
- 从
subscribe_score
获得该用户的邀请人数。 - 从
subscribe_score
获得比该用户邀请人数多的用户,然后count()
。
- 从
- 获得10名外用户的名次需要
count()
,如果用户排名很靠后,则对内存消耗很严重。 - 10名以外的用户排名不准确,没有符合需求中的规则。
- 如果第10名并列用户很多的话,获得前10名的计算会比较耗时。