Skip to content

Instantly share code, notes, and snippets.

@liuxd
Last active June 20, 2024 23:07
Show Gist options
  • Save liuxd/0f2555572f6de387890fe8335a8dfb00 to your computer and use it in GitHub Desktop.
Save liuxd/0f2555572f6de387890fe8335a8dfb00 to your computer and use it in GitHub Desktop.
[#10 实时排行榜的实现思路] #編程之道

实时排行榜的实现思路

需求

通过带参数的二维码实现病毒式推广,增加微信公众号的关注用户数量。在指定日期内的前10名用户可以获得指定奖品。需求详情:

  1. 每个用户进入活动页面,会显示自己的排名和已邀请人数,以及前10名的排名信息。
  2. 排名逻辑:先按邀请人数排名。如果人数相同,则按达到此数量的时间的先后顺序进行排序,先达到者排名靠前。
  3. 已关注的用户扫码不算邀请人数。

方案

  1. 使用Redis的Sorted Set记录用户的有效邀请人数。(键名:subscribe_score
  2. 使用Redis的Hash存储记录用户最新的有效关注动作的时间。(键名:subscribe_time
  3. 当用户产生扫码事件后微信会发送消息到开发者服务器。如果是根据规则判定是有效关注动作,则将subscribe_score中该用户的关注人数增加1,同时更新subscribe_time里该用户的最新关注动作的时间。
  4. 前10名排名算法:
    1. subscribe_score获得分数最高的前10名用户。
    2. subscribe_score获得第10名分数相同的所有用户,与前10名用户数据合并。
    3. 将前两步的结果进行两次排序:按人数降序,按时间升序。
    4. 取第3步排序后的结果的前10名。
  5. 10名以外用户获得自己排名信息的逻辑:
    1. subscribe_score获得该用户的邀请人数。
    2. subscribe_score获得比该用户邀请人数多的用户,然后count()

问题

  1. 获得10名外用户的名次需要count(),如果用户排名很靠后,则对内存消耗很严重。
  2. 10名以外的用户排名不准确,没有符合需求中的规则。
  3. 如果第10名并列用户很多的话,获得前10名的计算会比较耗时。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment