先说最简单的排行榜。其实之前我们有个用于投票的系统,但是他没有用有序集合,他是这样做的:用redis最基本的 ​​key-value​​结构中记录票数, ​​key​​是选项, ​​value​​是票数,然后每个月的后三天不能再进行投票,因为需要一个定时任务,将票数统计出来持久存储,作为本月的排行榜。可以看到有好多缺点:第一不能实时计算榜单,只能每个月跑脚本最后计算出来;第二每个月都有几天用户不能投票,损失一大波流量;第三只能支持月榜。排行榜场景用了Redis而没用 ​​ZSet​​挺遗憾的。

那我们在系统中设计了多个周期的排行榜,有小时榜、日榜、周榜、月榜、总榜。解释一下 ​​小时榜​​就是所有列表成员,在一个小时内获取票数的排行榜,其他榜单以此类推。

能做到不同排行榜主要是在于ZSet的 ​​key​​的设置,一个 ​​key​​就是一个排行榜,向不同 ​​key​​对 ​​member​​的 ​​score​​进行增加,ZSet会帮助我们进行排序,而我们只需要调用 ​​ZRANGE​​或者 ​​ZREVRANGE​​即可返回排行榜。