千家信息网

Redis中如何使用SortedSet实现多维度排序

发表于:2024-10-23 作者:千家信息网编辑
千家信息网最后更新 2024年10月23日,这篇文章主要介绍Redis中如何使用SortedSet实现多维度排序,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!关于SortedSet首先,我们都知道Redis的Sorted
千家信息网最后更新 2024年10月23日Redis中如何使用SortedSet实现多维度排序

这篇文章主要介绍Redis中如何使用SortedSet实现多维度排序,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

关于SortedSet

首先,我们都知道Redis的SortedSet是可以根据score进行排序的,以手机应用商店的热门榜单排序为例,根据下载量倒序排列,其简单用法如下:

127.0.0.1:6379> zadd TopApp 12000000 wechat(integer) 1127.0.0.1:6379> zadd TopApp 8000000 taobao 10000000 alipay(integer) 2127.0.0.1:6379> ZREVRANGE TopApp 0 -11) "wechat"2) "alipay"3) "taobao"

对SortedSet做一下简单总结:

  1. 默认升序排列,即通过命令 ZRANGE 实现;如果要按照降序排列,需要通过命令 ZREVRANGE 实现;

  2. 当score即得分一样时,按照 字典顺序 对member进行排序,字典排序用的是二进制,它比较的是字符串的字节数组,所以实际上是比较ASCII码。

简单用法介绍完后,接下来给出几种方案,介绍 如何利用Redis实现多维度排序 。同样的,还是以手机应用商店的热门榜单排序为例:首先按照APP的下载量倒序排序,如果下载量一样,则按照最后更新时间倒序排列。

方案1

介绍的第一个方案,并不需要依赖SortedSet,它的实现非常简单,但是需要产品做简单的妥协,即不能实时更新榜单。其实现方案是:定时每隔1分钟(可以由产品确定时间间隔)通过SQL(select * from tb_apps order by download_count desc, updated_time desc limit 300)或者其他方式计算热门榜单,然后把TOP300用List结构保存到缓存中。

说明:根据应用商店的用户行为分析,真实用户很少会预览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的下载量和最后更新时间分别如下(说明:更新时间只精确到秒):

wechat-下载量:12000000,最后更新时间:1564022201;其score为:12000000.1564022201
qq-下载量:12000000,最后更新时间:1564022222;其score为:12000000.1564022222
tiktok-下载量:9808900,最后更新时间:1563552267;其score为:9808900.1563552267
taobao-下载量:11006600,最后更新时间:1564345601;其score为:11006600.1564345601
alipay-下载量:11006600,最后更新时间:1564345600;其score为:11006600.1564345600

接下来,我们通过如下命令将这5个APP用SortedSet数据类型保存到Redis中:

zadd TopApp 12000000.1564022201 wechat 12000000.1564022222 qq 9808900.1563552267 tiktok 11006600.1564345601 taobao 11006600.1564345600 alipay

保存后,我们看一下排序结果是否符合我们的预期:

127.0.0.1:6379> zrevrange TopApp 0 -11) "qq"2) "wechat"3) "taobao"4) "alipay"5) "tiktok"

写在最后

是不是很完美?

还不完美,这种讨巧的方式只能实现二维排序。如果有三维排序,四维排序呢?这里笔者提供一种实现参考,即 自定义得分权重计算公式 ,这个公式包含所有影响排序的因子,例如:downloadCount*1000+updatedTime。这种实现无论排序维度多少都搞得定,但是需要注意的是,在具体实现时一定注意不要让score溢出。

以上是"Redis中如何使用SortedSet实现多维度排序"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

排序 时间 下载量 更新 方案 多维 多维度 命令 用户 热门 倒序 商店 因子 就是 数据 应用 影响 特殊 接下来 产品 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 u8数据库为质疑状态 如何查看数据库作业脚本 网络技术展会的招商 群晖 搭建邮件服务器 用友u8数据库服务没有启动 深圳服务器电源排名 只让一个单元格填写数据库 企业社交网络安全知识 我的世界召唤服务器主城的指令 电脑服务器密码输入错误 网络安全工作先进个人 江苏程序软件开发服务费 网络安全性风险评估多久进行一次 敏捷软件开发 c 下载 服务器安全性测试工具 护网行动2020网络安全总结 学校网络安全组织机构 数据库表格修改一列 服务器插内存条会有日志吗 数据库查询备份策略 云服务器贵 阿里云数据库默认密码 珠海企业直播软件开发 计算机网络技术获奖情况怎么写 华为荣耀服务器文件夹 河南律旗网络技术有限公司介绍 上虞财务软件开发怎么样 涉县支行网络安全宣传 中国期刊全文数据库官网是知网吗 九江网络安全课程收费标准
0