Redis有序集合学习
说明
有序集合顾名思义具备了“有序”和“集合”的两种特性,它在存储元素成员的时候,会给每个成员设置一个分值,这些成员会自动按照分值的大小进行排列。其中分值除了是数字以外还可以是“+inf”(无穷大)和“-inf”(无穷小)。正因为具备了有序和集合两种特性,所以它的结构非常灵活,同时有具备了列表和集合的一些特性。而一想到有序集合的结构,我们就联想到百度的明星排名或者微博的热搜(每个热搜是按照搜索的热度量或浏览量排名的)。
命令
ZADD
ZADD sorted_set [XX|NX] score member [score member ...]
该命令用于向有序集合中添加相应的成员,它会返回新添加成员的数量。若成员已在有序集合中,则对成员的分值进行更新。另外该命令有额外的参数XX和NX来分别表明是只更新还是只添加操作,若只更新,则未有的成员会被忽略,若只添加则已有的成员会被忽略。
ZREM
ZREM sorted_set member [member ...]
删除有序集合中指定的一个或多个成员。该命令返回删除成功的成员数量。
ZSCORE
ZSCORE sorted_set member
获取指定成员的分值。
ZINCRBY
ZINCRBY sorted_set increment member
对成员的分值进行自增或自减操作,若score为负数,则对成员分值进行自减,若成员不存在,则给成员设置对应的分值,此时相当于ZADD命令。
ZCARD
ZCARD sorted_set
获取有序集合的大小,即有序集合的成员数量。
ZRANK、ZREVRANK
ZRANK sorted_set member
ZREVRANK sorted_set member
获取有序集合中指定成员的排名。ZRANK命令返回的是成员的升序排列排名,即成员在按照分值从小到大进行排序的排名。而ZREVRANK命令是降序排名。其中排名从0开始。
ZRANGE、ZREVRANGE
ZRANGE sorted_set start end
ZREVRANGE sorted_set start end
获取指定索引范围内的成员,其中ZRANGE命令是按照升序排列方式获取的,ZREVRANGE命令按照降序排列方式获取。索引指定的范围是闭区间。这两个命令也可以指定负数为索引,例如获取最后一个成员,则索引范围为“-1 -1”。
可以在命令后面添加WITHSCORES参数,顺便也返回对应成员的分值。
ZRANGEBYSCORE、ZREVRANGEBYSCORE
ZRANGEBYSCORE sorted_set min max
ZREVRANGEBYSCORE sorted_set max min
获取指定分值范围内的成员,其分值范围默认取闭区间。注意ZRANGEBYSCORE命令是先min后max,ZREVRANGEBYSCORE恰好相反。
该命令与ZRANGE类似,后面可以跟WITHSCORES来获取对应成员及其分值。
默认情况下这两个命令会返回分值范围内的所有成员,但如果范围内成员数量过多,可以使用如下命令限制返回的成员数量:
ZRANGEBYSCORE sorted_set min max [LIMIT offset count]
ZREVRANGEBYSCORE sorted_set max min [LIMIT offset count]
其中offset参数用于指定命令在返回结果之前需要跳过的成员数量,count参数则用于指示命令最多可以返回多少个成员。
也可以在命令的min和max前加**(**符号来设置为开区间。其中min和max还可以是+inf和-inf。
ZCOUNT
ZCOUNT sorted_set min max
获取指定分值范围内的成员数量。该命令也像上面的命令一样,可以在命令的min和max前加**(**符号来设置为开区间。其中min和max还可以是+inf和-inf。
ZREMRANGEBYRANK
ZREMRANGEBYRANK sorted_set start end
删除指定索引范围内的成员。该命令接受的是一个闭区间。
ZREMRANGEBYSCORE
ZREMRANGEBYSCORE sorted_set min max
删除指定分值范围内的成员,其中这个参数后面的分值默认取闭区间,也可以在分值前加 **(**来取开区间。其中min和max还可以是+inf和-inf。
ZUNIONSTORE、ZINTERSTORE
ZUNIONSTORE destination numbers sorted_set [sorted_set ...]
ZINTERSTORE destination numbers sorted_set [sorted_set ...]
有序集合的并集计算、交集计算。其中numbers参数用于指定参与计算的有序集合数量。计算后得到的结果将存储到destination指定的键中。默认在计算的时候,当多个有序集合中有相同的成员时,则最终计算结果后的该成员的分值是原来的有序集合中对应成员的分值相加的结果。
若这两个命令后面跟了AGGREGATE选项,则可以让用户选择使用哪个聚合函数来计算相同成员的分值,如:
ZUNIONSTORE destination numbers sorted_set [sorted_set ...] AGGREGATE [SUM|MIN|MAX]
ZINTERSTORE destination numbers sorted_set [sorted_set ...] AGGREGATE [SUM|MIN|MAX]
SUM是相加,MIN是取最小值,MAX是取其中最大的。若不跟AGGREGATE选项,则默认取SUM函数。
另外,这两个命令还可以跟WEIGHTS选项。该选项用来为各个集合的成员设置权重。命令如下:
ZUNIONSTORE destination numbers sorted_set [sorted_set ...] [WEIGHTS weight [weight ...]]
在使用WEIGHTS选项时,用户需要为每个给定的有序集合设置一个权重,命令将这个权重与成员的分值相乘,得出成员的新分值,然后执行聚合计算;如果用户在使用该选项时不想改变某个给定有序集合的分值,则只需要将哪个有序集合的权重设置为1即可。
另外这两个命令除了可以使用有序集合外,还可以使用集合作为输入,默认情况下这两个命令将把所有集合看作所有成员分值为1的集合进行计算。
ZPOPMAX、ZPOPMIN
ZPOPMAX sorted_set [count]
ZPOPMIN sorted_set [count]
弹出分值最高和最低的count个成员,默认弹出一个。
BZPOPMAX、BZPOPMIN
BZPOPMAX sorted_set [sorted_set ...] timeout
BZPOPMIN sorted_set [sorted_set ...] timeout
阻塞式弹出最大/最小元素。其用法跟Redis的列表的BLPOP命令类似。该命令弹出元素时将返回一个包含3个项的数据,分别为弹出元素的有序集合、被弹出元素的成员以及它对应的分值。
有序集合所有成员的分值相同时
ZRANGEBYLEX、ZREVRANGEBYLEX
ZRANGEBYLEX sorted_set min max
ZREVRANGEBYLEX sorted_set max min
返回指定字典序范围内的成员。当所有成员的分值相同时,此时分值排序已不起作用,而是根据字典序进行排序。min和max用于指定用户想要获取的字典序范围,它们的值可以是以下几种之一:
- 带有**[**符号的值表示在结果中包含给定值具有同等字典序大小的成员。
- 带有**(**符号的值表示在结果中不包含给定值具有同等字典序大小的成员。
- 加号**+**表示无穷大。
- 减号**-**表示无穷小。
比如一个有序集合中的所有成员都是一些字符串,它们的分值都相同。若想获取以字母“a”开头的成员,则命令为:ZRANGEBYLEX sorted_set [a (b
ZREVRANGEBYLEX以逆序的方式返回。
ZLEXCOUNT
ZLEXCOUNT sorted_set min max
统计字典序指定范围内的成员数量。它的min和max参数格式与ZRANGEBYLEX的格式完全相同。
ZREMRANGEBYLEX
ZREMRANGEBYLEX sorted_set min max
移除字典序指定范围内的成员。它的min和max参数格式与ZRANGEBYLEX的格式完全相同。
上一篇: 基于有序链表实现的优先队列
下一篇: c++ stl 二分查找