需求
常见的排行榜有社交游戏排行榜、积分排行榜、商品排行榜。
一般的需求无非如下几点:
1.全局用户的排行(得分+排名)情况
2.单个用户的排行情况
3.排行榜前10(前N)的排行情况
4.自己朋友圈的排行情况
实现思路
需求中,既有单个用户的查询,又有某一个范围用户的查询(top N)。
当数据量很小时,可以使用mysql单表来存放数据。但数据量很大的时候,mysql往往需要进行分表分库,这个时候实现起来会很复杂。这个时候一般都会采用redis的zset来实现。
需求1:可以将所有用户的得分和用户id存放在一个zset中,这样子可以得到有序的全局用户的排行情况。用户的增删则通过ZADD/ZREM来实现。用户得分的增加则通过ZINCRYBY实现。
需求2:单个用户的排行情况,可以使用ZREVRANG rank uid来获取。
需求3:排行榜TOP N,则可以通过ZREVRANGEBYSCORE来获取。
需求4:app端将朋友圈的user_id集合传给后台,后台逐个通过ZSCORE rank uid来获取所有朋友的分数。然后对这些分数排序后返回给app端。