redis有序集合-zset

概念:它是在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

上一篇:Redis对象——有序集合(ZSet)


下一篇:redis 有序集合(zset)函数