您现在的位置是:主页 > news > 域名需要跟网站名称一致么/视频营销成功的案例
域名需要跟网站名称一致么/视频营销成功的案例
admin2025/5/5 17:01:48【news】
简介域名需要跟网站名称一致么,视频营销成功的案例,网站做中英文英文太长怎么办,wordpress帮助中心模板文章目录一、背景二、情景再现三、 设计当天排行榜redis 有序集合 sorted set用法详解1. 添加member成员和score2. 按照score的升序或降序遍历指定范围的展member 和score3. 获取指定范围的排名member4. 获取指定member的score排名四、 设计一周或每月排行榜一、背景 在面试中经…
文章目录
- 一、背景
- 二、情景再现
- 三、 设计当天排行榜
- redis 有序集合 sorted set用法详解
- 1. 添加member成员和score
- 2. 按照score的升序或降序遍历指定范围的展member 和score
- 3. 获取指定范围的排名member
- 4. 获取指定member的score排名
- 四、 设计一周或每月排行榜
一、背景
在面试中经常会遇到一些场景的问题,如果我们只会在理论上使用技术,那么学习到的理论就无法得到实践,难以掌握知识点,此文就在面试官问到如何设计排行榜一问来解析实现的过程。
例如微信的运动排行榜,每天都有一个运动记录,可以看到排行榜,主要包含:
- 今天本账号下运动步数以及排名。
- 今天本账号列表里的好友运动步数以及排名。
二、情景再现
面试官:
如果让你设计排行榜,你要怎么实现?
我:
这个我会! 可以使用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 withscores
or zrevrange key start stop withscores
区别: zrange按照score的 从小到大进行展示, zrevrange按照score的从大到小进行展, 两个后面都可以不用带withscores,查询出来的就不会显示score这一项。
可以使用0 -1 遍历该key下的全部score和member。
注: 如果同一个key中有两个相同的score,那么就按照他的
字典顺序来展示,如下效果:
3. 获取指定范围的排名member
格式: zrange key start stop
or zrevrange key start stop
例如,我要获取到分数排名前三的member, 使用命令:
zrevrange 20210315 0 2
例如,我要获取到所有排名,使用命令:
zrevrange 20210315 0 -1
4. 获取指定member的score排名
格式: zrank key member
or zrevrank key member
区别: zrank 获取到由小到大的第几个位置, zrevrank获取到的是由大到小的第几个位置。
例如我要获取上面的 zhangsan 的分数排第几,可以使用命令: zrank 20210315 zhangsan, 效果如下:
可以发现,所有的member按照score从小到大进行排序出来了,但是微信运动的步数是,步数大的在前面,因此更适合用zrevrank,另外将获取到的值进行+1 , 那么排就有了。
综合2、3和4,我们在微信好友中的运动步数score、member列表,以及member对应的排名rank 就有了!最重要的一点,把当天的日期20210315作为key就能够索引到我们想要的数据和排名了。
面试官看你能设计出当天的排行榜,好感度逐渐增加,随后又追问了,如果要查看一周或一个月的排行榜,要怎么弄呢?
四、 设计一周或每月排行榜
一周的数据其实就是7天数据的累加,累加完后再排序,一个月的数据原理也是一样。
- 计算给定一个或多个有序集的交集并将结果放到一个新的有序集合destination中。
格式:ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
- 计算给定一个或多个有序集的并集并将结果放到一个新的有序集合destination中。
格式:ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
默认情况下,结果集中某个成员的分数值是所有给定集下该成员分数值之和
下面我们造七天的数据, 可以复制到redis客户端,直接执行即可。
zadd 20210315 1000 bing
zadd 20210315 2000 zhangsan
zadd 20210315 3000 zhu
zadd 20210315 3500 zhuzhu
zadd 20210315 1500 applezadd 20210316 1000 bing
zadd 20210316 2000 zhangsan
zadd 20210316 3000 zhu
zadd 20210316 3500 zhuzhu
zadd 20210316 1500 applezadd 20210317 1000 bing
zadd 20210317 2000 zhangsan
zadd 20210317 3000 zhu
zadd 20210317 3500 zhuzhu
zadd 20210317 1500 applezadd 20210318 1000 bing
zadd 20210318 2000 zhangsan
zadd 20210318 3000 zhu
zadd 20210318 3500 zhuzhu
zadd 20210318 1500 applezadd 20210319 1000 bing
zadd 20210319 2000 zhangsan
zadd 20210319 3000 zhu
zadd 20210319 3500 zhuzhu
zadd 20210319 1500 applezadd 20210320 1000 bing
zadd 20210320 2000 zhangsan
zadd 20210320 3000 zhu
zadd 20210320 3500 zhuzhu
zadd 20210320 1500 applezadd 20210321 1000 bing
zadd 20210321 2000 zhangsan
zadd 20210321 3000 zhu
zadd 20210321 3500 zhuzhu
zadd 20210321 1500 apple
接下来,求一周的数据, 因为默认会求和,可以不用带 aggreate sum, 使用如下命令计算7天的数据:
zunionstore last_seven_days 7 20210315 20210316 20210317 20210318 20210319 20210320 20210321
结果:
可以发现,7天的数据已经累加并排序,求排行和排名就按照上述方式即可,同理一个月的数据也是这样求即可。