解决百万用户量积分排名

前情提要:利用redis的zset数据类型可以解决少量用户实时积分排行的问题,但是用户量达到百万级后,内存会撑不住。

实时排名:
如果积分最大值不高,比如说最大5000积分左右,那么可以用桶排序,占用的内存不算大。
一个积分代表一个桶,每个桶里面装了一个计数的数字。比如(score-10000->10这种k-v键值对,表示10000积分的有10个人)

如果说积分最大值比较高,比如说一百万,桶排序也会很占内存。那么照这个思路,可以存数据库,0-50000一个表,分20个表,用聚合函数SUM()协助统计每个表的人数,以此统计排名。

桶排序参考:http://novoland.github.io/%E7%AE%97%E6%B3%95/2014/07/26/%E6%A1%B6%E6%8E%92%E5%BA%8F%E5%9C%A8%E6%8E%92%E8%A1%8C%E6%A6%9C%E9%97%AE%E9%A2%98%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8.html

http://www.cnblogs.com/skywang12345/p/3602737.html

非实时排名:
若非实时的话,可以每天跑一次数据库,做一张积分排名表。每个分数对应一个排名。

非实时且只需前10000名:
这个比较简单,存数据库或内存都可以

你可能感兴趣的:(解决百万用户量积分排名)