使用Redis有序集合实现投票排行榜系统
https://mp.weixin.qq.com/s/GcPF8jte8Nzi4Ae0jojXuQ
先说最简单的排行榜。其实之前我们有个用于投票的系统,但是他没有用有序集合,他是这样做的:用redis最基本的 key-value
结构中记录票数, key
是选项, value
是票数,然后每个月的后三天不能再进行投票,因为需要一个定时任务,将票数统计出来持久存储,作为本月的排行榜。可以看到有好多缺点:第一不能实时计算榜单,只能每个月跑脚本最后计算出来;第二每个月都有几天用户不能投票,损失一大波流量;第三只能支持月榜。排行榜场景用了Redis而没用 ZSet
挺遗憾的。
那我们在系统中设计了多个周期的排行榜,有小时榜、日榜、周榜、月榜、总榜。解释一下 小时榜
就是所有列表成员,在一个小时内获取票数的排行榜,其他榜单以此类推。
能做到不同排行榜主要是在于ZSet的 key
的设置,一个 key
就是一个排行榜,向不同 key
对 member
的 score
进行增加,ZSet会帮助我们进行排序,而我们只需要调用 ZRANGE
或者 ZREVRANGE
即可返回排行榜。