有些功能需求里面会产生一些积分,有了积分那么基本上就少不了根据积分做排名了。这里记录下实现方式。
实现方式:
实时排名:每次需要拿名次的时候,就根据当前的积分进行排序,显示当前名次。
非实时排名:这种方式基本上都是每天凌晨根据当前的积分排一次,然后把结果放到缓存中, 需要显示名次就直接从缓存中读
性能影响:
实时的排名方式应为每次都要重新对用户积分进行排序,所以对性能影响比较大,但是对用户比较友好。
非实时一天只在凌晨排一次,一天之内不管积分增加多少显示的名次都是一样的,有些用户可能会觉得很奇怪。
对实时排名优化:
要想对排序进行优化,可以想办法减少需要排名的用户数量。可以把所有玩家根据积分进行分段。
array( 1000 => array(用户) 900 => array() 800 => array() . . . )
如果玩家积分处在900的积分段,那么只需要把此段的玩家进行排名,然后把这个名次加上1000分段的总人数就是最终的玩家排名。这种方试,最好的情况是不需要排序(900积分段就自己),最坏的情况是所有玩家全都进行排序(玩家都集中在其中一个积分段)。积分变动的时候,所处的积分段也要相应的更改。上面的例子是按100分为一段。在分段的积分选择上面,最好是根据每次增加积分的倍数。
也可以从业务上进行优化:只排前n名的玩家,或则积分大于n的才进行排名。未达标的名次显示未上榜.....
能用redis的还是用redis比较简单。
原文地址:http://effective.blog.51cto.com/8296150/1732133