有序集合(sorted set)是在集合(set)的基础上为集合中的每个元素都关联了一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在等集合类型支持的操作,还能获得分数最高或最低的前N个元素、获得指定分数范围内的元素等与分数相关的操作。虽然集合中的每个元素都是不同的,但是他们的分数却可以相同。
有序集合在某些方面和列表类型有些相似
1)二者都是有序的
2)二者都可以获得某一范围的元素
但是二者也有很大的区别,这使得他们的应用场景也不相同。
1)列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间元素的速度会比较慢,所以它更适合实现如“新鲜事”或“日志”这样很少访问中间元素的应用。
2)有序集合类型是使用散列表和跳跃表(skip list)实现的,所以即使读取位于中间的数据速度也很快(时间复杂度是O(log(N))。
3)列表中不能简单的调整某个元素的位置,但是有序集合可以(通过更改这个元素的分数)。
4)有序集合要比列表类型更耗费内存。
命令
1、增加元素
ZADD key score member [score member ...]
ZADD命令用来向有序集合中增加一个元素和该元素的分数,如果元素已经存在则会用新的分数替换原有分数,此命令返回的使新增加到集合中的元素个数。分数可以是整数也可以是浮点数,其中+inf 和-inf分表表示正无穷和负无穷。
2、获得元素的分数
ZSCORE key member
3、获得排名在某个范围的元素列表
ZRANGE key start stop [WITHSCORES]
ZREVRANGE key start stop [WITHSCORES]
ZRANGE命令会按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)。ZRANGE命令与LRANGE命令十分相似,如索引都是从0开始,负数代表从后向前查找(-1表示最后一个元素)。如果需要同时获得元素的分数的话在ZRANGE命令尾部加上WITHSCORES参数,这时返回的数据格式就从“元素1,元素2,...,元素N”变为“元素1,分数1,元素2,分数2,...,元素N,分数N”。
ZRANGE命令的时间复杂度是O(log n + m)(其中n 为有序集合的技术,M为返回的元素个数),如果两个元素的分数相同,Redis会按照字典顺序来进行排序。
ZREVRANGE与ZRANGE唯一的不同就在于ZREVRANGE命令是按照元素分数从大到小的顺序给出结果的。
4、获取指定分数范围的元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
ZRANGEBYSCORE命令的参数虽多,但是相对好理解,此命令按照元素分数从大到小的顺序返回分数在min 和max之间(包含两端)的元素。
如果希望分数范围不好喊端点值,可以在分数前面加上“(”符号,例如如果希望返回80到100的数据,可以包含80但是不包含100,命令:ZRANGEBYSCORE key 80 (100
min 和max还支持无穷大,同ZADD一样-inf和+inf分表表示负无穷和正无穷,比如希望拿到所有高于80分的数据(不包含80分),ZRANGEBYSCORE key (80 +inf
WITHSCORES与前面的ZRANGE用法相同,LIMIT offset count 与sql的语法基本相同,即在获得的元素列表的基础上向后偏移offset个元素,并且只获得前count个元素。
5、增加某个元素的分数
ZINCRBY key increment member
ZINCRBY可以增加一个元素的分数,返回值是更改后的分数。如果increment为负数则表示减分。
6、获得集合中元素的数量
ZCARD key
7、获得指定分数范围内的元素个数
ZCOUNT key min max
ZCOUNT命令的min 和max参数的特性和ZRANGEBYSCORE命令中的一样。
8、删除一个或多个元素
ZREM key member [member ..]
此命令返回成功删除的元素的数量
9、按照排名范围删除元素
ZREMRANGEBYRANK key start stop
ZREMRANGEBYRANK命令按照元素分数从小到大的顺序删除在指定排名范围内的所有元素,并返回删除的元素个数。
10、按照分数范围删除元素
ZREMRANGEBYSCORE key min max
ZREMRANGEBYSCORE命令会删除指定分数范围内的所有元素,参数min和max特性跟ZRANGEBYSCORE命令中一样,返回值是删除的元素数量。
11、获得元素的排名
ZRANK key member
ZREVRANK key member
ZRANK命令会哦按照元素分数从小到大的顺序获得指定的元素排名(从0开始)。ZREVRANK命令则相反。
12、计算有序集合的交集
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight...]] [AGGREGATE SUM | MIN | MAX]
ZINTERSTORE命令用来计算多个有序集合的交集并将结果存储在destination键中(同样以有序集合类型存储),返回值为destination键中元素的个数。
destination键中元素的分数是由AGGREGATE参数决定的。
1)当AGGREGATE是SUM时(也就是默认),destination键中元素的分数是每个参与计算的集合中该元素分数的和。
2)当AGGREGATE是MIN时,destination键中元素的分数是每个参与计算的集合中该元素分数的最小值。
3)当AGGREGATE是MAX时,destination键中元素的分时是每个参与计算的集合中该元素分数的最大值。
ZINTERSTORE命令还能通过WEIGHTS 参数设置没每个集合的权重,每个集合在参与计算式元素的分数会被乘上该集合的权重。
另外还有一个命令与ZINTERSTORE命令用法一样,名为ZUNIONSTORE他的作用是计算集合间的并集。