概念:它是在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动按新的值调整顺序。可以理解为有两列的mysql表,一列存储value,一列存储顺序,操作中key理解为zset的名字。
和set一样sorted,sets也是string类型元素的集合,不同的是每个元素都会关联一个double型的score。sorted set的实现是skip list和hash table的混合体。
当元素被添加到集合中时,一个元素到score的映射被添加到hash table中,所以给定一个元素获取score的开销是O(1)。另一个score到元素的映射被添加的skip list,并按照score排序,所以就可以有序地获取集合中的元素。添加、删除操作开销都是O(logN)和skip list的开销一致,redis的skip list 实现是双向链表,这样就可以逆序从尾部去元素。sorted set最经常使用方式应该就是作为索引来使用,我们可以把要排序的字段作为score存储,对象的ID当元素存储。
常用命令:
1. zadd key score memeber [[score member] [score member]]:
将一个或多个 member
元素及其 score
值加入到有序集 key
当中。
如果某个 member
已经是有序集的成员,那么更新这个 member
的 score
值,并通过重新插入这个 member
元素,来保证该 member
在正确的位置上。
score
值可以是整数值或双精度浮点数。
如果 key
不存在,则创建一个空的有序集并执行 ZADD 操作。
当 key
存在但不是有序集类型时,返回一个错误。
返回值:被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。
2. zscore key member:返回有序集 key
中,成员 member
的 score
值。
3. zincrby key increment member:
为有序集 key
的成员 member
的 score
值加上增量 increment
。
可以通过传递一个负数值 increment
,让 score
减去相应的值,比如 ZINCRBY key -5 member
,就是让 member
的 score
值减去 5
。
当 key
不存在,或 member
不是 key
的成员时, ZINCRBY key increment member
等同于 ZADD key increment member
。
当 key
不是有序集类型时,返回一个错误。
score
值可以是整数值或双精度浮点数。
4. zcard key:返回有序集 key
的基数。
5. zcount key min max:返回有序集 key
中, score
值在 min
和 max
之间(默认包括 score
值等于 min
或 max
)的成员的数量。
6.zrange key start stop [WITHSCORES]:
返回有序集 key
中,指定区间内的成员。
其中成员的位置按 score
值递增(从小到大)来排序。
具有相同 score
值的成员按字典序(lexicographical order )来排列。
7. zrevrange key start stop [WITHSCORES]:
返回有序集 key
中,指定区间内的成员。
其中成员的位置按 score
值递减(从大到小)来排列。 具有相同 score
值的成员按字典序的逆序(reverse lexicographical order)排列。
除了成员按 score
值递减的次序排列这一点外, ZREVRANGE 命令的其他方面和 ZRANGE key start stop [WITHSCORES] 命令一样。
8. zrangebyscore key min max [WITHSCORES][LIMIT offset count]:
返回有序集 key
中,所有 score
值介于 min
和 max
之间(包括等于 min
或 max
)的成员。有序集成员按 score
值递增(从小到大)次序排列。
具有相同 score
值的成员按字典序(lexicographical order)来排列(该属性是有序集提供的,不需要额外的计算)。
可选的 LIMIT
参数指定返回结果的数量及区间(就像SQL中的 SELECT LIMIT offset, count
),注意当 offset
很大时,
定位 offset
的操作可能需要遍历整个有序集,此过程最坏复杂度为 O(N) 时间。
可选的 WITHSCORES
参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score
值一起返回。 该选项自 Redis 2.0 版本起可用。
9.zrevrangebyscore key min max [WITHSCORES][LIMIT offset count]:
返回有序集 key
中, score
值介于 max
和 min
之间(默认包括等于 max
或 min
)的所有的成员。有序集成员按 score
值递减(从大到小)的次序排列。
具有相同 score
值的成员按字典序的逆序(reverse lexicographical order )排列。
除了成员按 score
值递减的次序排列这一点外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
命令一样。
10. zrank key member:
返回有序集 key
中成员 member
的排名。其中有序集成员按 score
值递增(从小到大)顺序排列。
排名以 0
为底,也就是说, score
值最小的成员排名为 0
。
使用 ZREVRANK key member 命令可以获得成员按 score
值递减(从大到小)排列的排名。
返回值:如果 member
是有序集 key
的成员,返回 member
的排名。 如果 member
不是有序集 key
的成员,返回 nil
。
11. zrevrank key member:
返回有序集 key
中成员 member
的排名。其中有序集成员按 score
值递减(从大到小)排序。
排名以 0
为底,也就是说, score
值最大的成员排名为 0
。
使用 ZRANK key member 命令可以获得成员按 score
值递增(从小到大)排列的排名。
如果 member
是有序集 key
的成员,返回 member
的排名。 如果 member
不是有序集 key
的成员,返回 nil
。
12. zrem key member [member...]:
移除有序集 key
中的一个或多个成员,不存在的成员将被忽略。
当 key
存在但不是有序集类型时,返回一个错误。
返回值:被成功移除的成员的数量,不包括被忽略的成员。
13. zremrangebyrank key start stop:
移除有序集 key
中,指定排名(rank)区间内的所有成员。
区间分别以下标参数 start
和 stop
指出,包含 start
和 stop
在内。
下标参数 start
和 stop
都以 0
为底,也就是说,以 0
表示有序集第一个成员,以 1
表示有序集第二个成员,以此类推。
你也可以使用负数下标,以 -1
表示最后一个成员, -2
表示倒数第二个成员,以此类推。
返回值:被移除成员的数量
14. zremrangebyscore key min max:
移除有序集 key
中,所有 score
值介于 min
和 max
之间(包括等于 min
或 max
)的成员。
自版本2.1.6开始, score
值等于 min
或 max
的成员也可以不包括在内,
详情请参见 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 命令。
15. zrangebylex key min max [LIMIT offset count]:
当有序集合的所有成员都具有相同的分值时, 有序集合的元素会根据成员的字典序(lexicographical ordering)来进行排序,
而这个命令则可以返回给定的有序集合键 key
中, 值介于 min
和 max
之间的成员。
如果有序集合里面的成员带有不同的分值, 那么命令返回的结果是未指定的(unspecified)。
16. zlexcount key min max:
对于一个所有成员的分值都相同的有序集合键 key
来说, 这个命令会返回该集合中, 成员介于 min
和 max
范围内的元素数量。
17. zremrangebylex key min max:对于一个所有成员的分值都相同的有序集合键 key
来说, 这个命令会移除该集合中, 成员介于 min
和 max
范围内的所有元素。
应用场景:
1.排行榜
id 为 6001 的新闻点击数加 1:zincrby hotNews:20190926 1 n6001
获取今天点击最多的 15 条:zrevrange hotNews:20190926 0 15 withscores