版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
一、背景
在面试中经常会遇到一些场景的问题,如果我们只会在理论上使用技术,那么学习到的理论就无法得到实践,难以掌握知识点,此文就在面试官问到如何设计排行榜一问来解析实现的过程。
例如微信的运动排行榜,每天都有一个运动记录,可以看到排行榜,主要包含:
今天本账号下运动步数以及排名。今天本账号列表里的好友运动步数以及排名。
二、情景再现
面试官:
如果让你设计排行榜,你要怎么实现?
我:
这个我会! 可以使用mysql, 将用户的好友列表关联的运动记录查询出来,然后通过order by 来进行排序,就可以实现了。查询自己的排行位置,只需要通过用户id来进行条件搜索就能实现。答完后,感觉信心满满!
面试官:
emm… 这种方法可以实现,mysql也确实能在业务数据量比较小的时候能够解决此问题,一旦数据量大达到千万级别的时候,不可避免地会出现慢查询,效率就会降低,有什么方法可以优化嘛?
我:
emm…,可以使用redis来实现,因为使用redis速度很快?
面试官:
嗯嗯,我们都知道redis是一种高速缓存数据库,那为啥子redis能实现?
我:
…
然后面试就结束了…
下面就来解释怎么使用redis来实现排行榜。
三、 设计当天排行榜
redis 有序集合 sorted set用法详解
sorted set 是一个有序、不重复的集合, 默认升序,排序的下标从0 开始,自带一个score 值,该值可以当作排行的标准。如果 key 和score和member相等,那么在使用zadd添加的时候会出现添加不进去的情况。
1. 添加member成员和score
格式:zadd key score member
2. 按照score的升序或降序遍历指定范围的展member 和score
格式:zrange key start stop withscoresorzrevrange key start stop withscores
区别: zrange按照score的 从小到大进行展示, zrevrange按照score的从