在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
说明:本次实践基于Redis版本3.2.11。 关于SortedSet 首先,我们都知道Redis的SortedSet是可以根据score进行排序的,以手机应用商店的热门榜单排序为例,根据下载量倒序排列,其简单用法如下: 127.0.0.1:6379> zadd TopApp 12000000 wechat (integer) 1 127.0.0.1:6379> zadd TopApp 8000000 taobao 10000000 alipay (integer) 2 127.0.0.1:6379> ZREVRANGE TopApp 0 -1 1) "wechat" 2) "alipay" 3) "taobao" 对SortedSet做一下简单总结:
简单用法介绍完后,接下来给出几种方案,介绍 如何利用Redis实现多维度排序 。同样的,还是以手机应用商店的热门榜单排序为例:首先按照APP的下载量倒序排序,如果下载量一样,则按照最后更新时间倒序排列。 方案1 介绍的第一个方案,并不需要依赖SortedSet,它的实现非常简单,但是需要产品做简单的妥协,即不能实时更新榜单。其实现方案是:定时每隔1分钟(可以由产品确定时间间隔)通过SQL( 说明:根据应用商店的用户行为分析,真实用户很少会预览10页以后的数据,即使有这种用户,我们也可以忽略掉。所以只需要将总计10页,即10x30=300个APP信息用List结构保存即可。分页取数据时,通过lrange命令即可轻松实现。 这种方案虽然简单,但是非常有用。即使不能做到实时,但是并没有影响用户体验。在项目初期需要快速发布,是一个比较推荐的做法。 方案2 方案2就是本文重点介绍的利用SortedSet实现多维度排序。 介绍方案之前,我们再看一下SortedSet排序因子score, 它是一个双精度64位的浮点型数字字符串。+inf和-inf都是有效值 ,能包括的整数范围是-(2^53) 到 +(2^53),或者说是-9007199254740992 到 9007199254740992。 那么,我们如何实现多维度排序呢?答案是 构造一个特殊的score 。以本文案例为例,排序影响因子是下载量和更新时间,那么我们可以构造一个这样特殊的浮点类型的score: 整数部分就是下载量,小数部分就是最后更新时间戳 。 talk is cheap,show me the code。假设有5个app的下载量和最后更新时间分别如下(说明:更新时间只精确到秒):
接下来,我们通过如下命令将这5个APP用SortedSet数据类型保存到Redis中:
保存后,我们看一下排序结果是否符合我们的预期: 127.0.0.1:6379> zrevrange TopApp 0 -1 1) "qq" 2) "wechat" 3) "taobao" 4) "alipay" 5) "tiktok" 写在最后 是不是很完美? 还不完美,这种讨巧的方式只能实现二维排序。如果有三维排序,四维排序呢?这里笔者提供一种实现参考,即 自定义得分权重计算公式 ,这个公式包含所有影响排序的因子,例如: 总结 以上所述是小编给大家介绍的Redis高级玩法之利用SortedSet实现多维度排序的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对极客世界网站的支持! |
请发表评论