假设我们现在有这样的需求:我们需要对同类数据进行排序,需要提供一种可以根据自身特征进行排序的方式。于是我们引入今天的类型:sorted_set,也叫做有序集合,通常我们也称为 zset,指的是在 redis 中,通常以 zset add 等命令操作。
有序集合可以保存可排序的数据,在set存储结构的基础之上添加可排序字段。有序集合数据结构如下图所示:
key
代表集合中的元素, score
代表元素对应的排序值。
本篇是该系列文章的第七篇,你可以通过以下链接阅读之前的内容
03-redis入门知识第3篇-redis的基本操作与数据类型
04-redis入门知识第4篇-redis中的string数据类型与基本的数据存取操作
相关符号如下:
+inf: 表示大于任何数
-inf: 表示小于任何数
(: 左开区间
): 右开区间
指令格式
查询示例
指令格式
交集操作指令示例
我们先执行以下指令添加测试数据
将以上是那个集合的交集保存到 ss 中
此时可以看到返回的数据如下图所示
此时我们可以看到每一个字段的score值被相加起来。我们还可以指定交叉的元素 取最大值(max)还是 最小值(min),而不是 求和值(sum),如下指令
分别取 ss1 和 ss2 的结果如下图所示
假设有以下的需求
使用 有序集合 对所有参与排名的资源建立排序依据,相关操作指令如下
指令格式
示例
redis中获取系统时间的指令
当任务或者消息待处理,形成了任务队列或者消息队列时,对于高优先级的任务要保障对其优先处理。我们利用sorted_set的特征,即可解决这个问题。对于有权重的任务,优先处理权重高的任务,采用score记录权重即可。如下指令
添加测试数据
根据权重从高到低查询任务列表
在实际的场景中,我们往往挨条任务取出来处理,使用下面的指令取出第一个任务
我们得到的任务元素是 order:id:425
,任务处理完成之后,将对应元素移除即可,如下指令
不过,以上的操作不是原子性(要么全部执行成功要么全部执行失败)的,我们这里暂且不讨论非原子性操作带来的后果,后面的章节会说明。
如果权重条件过多时,需要对排序score值进行处理,保障score值能够兼容2个条件或者多个条件,例如外贸订单优先于国内订单,总裁订单优先于员工订单,经理订单优先于员工订单。解决方案如下:
示例:外贸101,国内102,经理104,员工008。那么员工下的外贸单为101008,经理下的国内订单为102004