排行榜的场景
首先我们来看一个场景,现在我需要实现一个游戏分数排行榜。那么分析一下,首先要支持排序吧,然后要支持每个人的实时分数变更,再后来我可能随时要知道某个用户所处的排名位置。有的同学说了,这很简单啊,我用MYSQL就搞定了。排序用order by,变更的话就是update,位置排名的话就是order by 按访问取出来然后count一下条数就知道处在第几条了。嗯,这看起来没毛病。但是一旦数据一多,比如达到了万级别或者十万级别以上,比如一个用户处在第5万名,那么一通查询和统计后,性能估计就达到瓶颈了。
于是我们想到了redis的有序集合数据类型,啊,似乎就像专门为排行榜量身定做的数据类型一样。我们来看官方的解释:
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
是不是很激动了。OK,现在开始来一起动动手动动脚看看吧。
redis有序集合实现排行榜实战
首先,我们安装完redis, 然后进入安装目录启动一下服务。
启动redis
接下来我们打开一个客户端进行连接。
连接redis
然后我们使用命令,创建一个排行榜集合list,并对这个排行榜加入4个成员member和分数。
按索引区间0-100输出成员列表和分数,按分数从小到大排序。
输出某成员的索引值,其实就是排名了。(不过要注意这里是从小到大的排名位置值,那其实我们通常要的是从大到小的排名位置值,别急,往下看)
返回某个指定成员的分数。
好了,我们要个真正的排行榜,按分数从大到小排序的。
那如果我只想要分数是3-1之间的成员排名呢?
好了,这个时候各个成员的分数发生了改变,怎么更新呢?更新完会自动输出新的排名吗?答案是肯定的。更改memberc的值,输出排序并查看索引。
我们再来看看怎么得到排名榜名次。其实索引值就是排名,要特别注意不管是升序还是倒序都是0开始。图中上面的命令排序是从小到大,下面是从大到小。下面的2就代表从大到小索引为1,也就是从大到小排序第3名即排行榜第三。
以上就是redis实现排行榜的例子了,是不是很水到渠成呢?