一、介绍
与set的区别在于“有序”二字,再集合类型的基础上都关联了一个分数(score).
二、与列表的区别
相同点:
(1)二者都是有序的。(区别于排序)
(2)二者都可以获得某一范围内的元素。
不同点:
(1)列表是通过链表实现的,获取靠近两端的元素速度极快,而当元素增多以后访问中间数据的速度会较慢,所以它更适合实现如:新鲜事,日志等很少访问中间元素的应用;
(2)有序集合是使用散列表和跳跃表(skip list)实现的,所以即使读取位于中间部分的数据速度也很快(时间复杂度是O(log(N)));
(3)列表类型不能简单调整某个元素的位置,但是有序集合可以。(通过更改这个元素的分数);
(4)有序结合比列表更耗内存。
三、适用场景
1.按点击量、时间排序。
四、命令
1.增加元素
ZADD key score member [ score member ...]
向有序集合中加入一个元素及该元素的分数,如果该元素存在则会用新的分数替换掉原有的分数。返回新加入集合中的元素个数。分数不仅可以是整数,还支持双精度浮点数。
例:ZADD test +inf a -inf b;其中+inf,-inf分别表示正无穷大和负无穷大。
2.获得元素的分数
ZSCORE key member
3.获得排名在某一范围的元素列表
ZRANGE key start end [ WITHSCORES ]
ZREVRANGE key start end [ WITHSCORES ]
ZRANGE命令按元素分数从小到大的顺序返回索引从start到end之间的所有的元素(包含两端的元素,查询全部0 -1)。如果需要同时获取分数在命令后加上WITHSCORES。
ZRANGE命令的时间复杂度是O(log n+m)(其中n为有序集合的基数,m为返回的元素个数)。如果两个元素分数相同,Redis会按照字典顺序(0<9<A<Z<a<z)来进行排序。中文元素按照UTF-8编码进行排序。
ZREVRANGE命令代表从大到小返回。
3.获得指定分数范围的元素
ZRANGEBYSCORE key min max [WITHSCORES ] [ LIMIT offset count]
- 按照元素分数从小到大的顺序返回分数在min和max之间(包含min和max)的元素。
- 如果希望分数范围不包含端点值,可以在分数前边加上“(”符号,min和max支持无穷大。
- LIMIT offset count:在获取得元素列表的基础上向后偏移offset个元素,并且只获取前count个元素。
ZREVRANGEBYSCORE:从大到小,max在前,min在后。
4.增加某个元素的分数
ZINCRBY key increment member :返回更改后的分数,如果指定的元素不存在,在执行命令之前会先建立它并将分数赋为0再执行命令。
5.获得集合中元素的个数
ZCARD key
6.获得指定分数范围内的元素个数
ZCOUNT key min max
7.删除一个或多个元素
ZREM key member [ member ...]:返回成功删除的元素数量
8.按照排名范围删除元素
ZREMRANGEBYRANK key start end
9.按照分数范围删除元素
ZREMRANGEBYSCORE key start end
10.获取元素的排名
ZRANK key member
ZREVRANK key member
11.计算有序集合的交集、并集
ZINTERSTORE destination numkeys key [key... ] [WEIGHTS weight [weight... ]] [AGGREGATE|SUM|MIN|MAX]
destination键中函数的分数是由AGGREGATE参数决定的。
- SUM:元素的分数是每个参与计算的集合中该元素的分数的和
- MIN:元素的分数是每个参与计算的集合中该元素的分数的最小值
- MAX:元素的分数是每个参与计算的集合中该元素的分数的最大值
WEIGTHS 每个集合的在计算中所占的权重。
ZUNIONSTORE:计算交集。