Redis数据类型-zSet基本使用_redis zset

特性

  • 有序且不可重复的集合
  • 每个元素都会关联一个 double 类型的分数。正是通过分数来为集合中的成员进行从小到大的排序
  • 类似Java中的数据结构Map<String,Double>,其中Double类型就是给每个value元素赋予一个score(权重)
  • 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)
  • 一个集合可以存储 2 ^ 32 - 1 个元素(4,294,967,295);
  • zSet有两种数据类型作为底层存储:
  • zskiplist+dictht
  • skiplist 编码的 Zset 底层为一个被称为 zset 的结构体,这个结构体中包含一个字典和一个跳跃表。跳跃表按 score 从小到大保存所有集合元素,查找时间复杂度为平均 O(logN)O(logN),最坏 O(N)O(N) 。字典则保存着从 member 到 score 的映射,这样就可以用 O(1)的复杂度来查找 member 对应的 score 值。虽然同时使用两种结构,但它们会通过指针来共享相同元素的 member 和 score,因此不会浪费额外的内存。
  • ziplist
  • ziplist 编码的 Zset 使用紧挨在一起的压缩列表节点来保存,第一个节点保存 member,第二个保存 score。ziplist 内的集合元素按 score 从小到大排序,其实质是一个双向链表。虽然元素是按​​score​​​ 有序排序的, 但对​​ziplist​​​ 的节点指针只能线性地移动,所以在​​REDIS_ENCODING_ZIPLIST​​ 编码的 Zset 中, 查找某个给定元素的复杂度为 O(N)。
  • ziplist 详细介绍

Redis数据类型-zSet基本使用_java_02

使用场景

  1. 热点话题、新闻等各种类型的排行榜
  2. 延迟队列
  3. 分布式定时器
  4. 时间窗口限流

命令使用

命令

说明

时间复杂度

ZADD key score member [[score member] [score member] …]

将一个或多个 ​​member​​​ 元素及其 ​​score​​​ 值加入到有序集 ​​key​​ 当中

O(M*log(N)), ​​N​​​ 是有序集的基数, ​​M​​ 为成功添加的新成员的数量

ZCARD key

返回有序集 ​​key​​ 的基数

O(1)

ZCOUNT key min max

返回有序集 ​​key​​​ 中, ​​score​​​ 值在 ​​min​​​ 和 ​​max​​​ 之间(默认包括 ​​score​​​ 值等于 ​​min​​​ 或 ​​max​​ )的成员的数量

O(log(N)+M), ​​N​​​ 为有序集的基数, ​​M​​​ 为值在 ​​min​​​ 和 ​​max​​ 之间的元素的数量

ZCOUNT key min max

返回有序集 ​​key​​​ 中, ​​score​​​ 值在 ​​min​​​ 和 ​​max​​​ 之间(默认包括 ​​score​​​ 值等于 ​​min​​​ 或 ​​max​​ )的成员的数量

O(log(N)+M), ​​N​​​ 为有序集的基数, ​​M​​​ 为值在 ​​min​​​ 和 ​​max​​ 之间的元素的数量

ZINCRBY key increment member

为有序集 ​​key​​​ 的成员 ​​member​​​ 的 ​​score​​​ 值加上增量 ​​increment​

O(log(N))

ZRANGE key start stop [WITHSCORES]

返回有序集 ​​key​​ 中,指定区间内的成员

O(log(N)+M), ​​N​​​ 为有序集的基数,而 ​​M​​ 为结果集的基数

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

返回有序集 ​​key​​​ 中,所有 ​​score​​​ 值介于 ​​min​​​ 和 ​​max​​​ 之间(包括等于 ​​min​​​ 或 ​​max​​​ )的成员。有序集成员按 ​​score​​ 值递增(从小到大)次序排列

O(log(N)+M), ​​N​​​ 为有序集的基数, ​​M​​ 为被结果集的基数

ZRANK key member

返回有序集 ​​key​​​ 中成员 ​​member​​​ 的排名。其中有序集成员按 ​​score​​ 值递增(从小到大)顺序排列

O(log(N))

ZREM key member [member …]

移除有序集 ​​key​​ 中的一个或多个成员,不存在的成员将被忽略

O(M*log(N)), ​​N​​​ 为有序集的基数, ​​M​​ 为被成功移除的成员的数量

ZREMRANGEBYRANK key start stop

移除有序集 ​​key​​ 中,指定排名(rank)区间内的所有成员

O(log(N)+M), ​​N​​​ 为有序集的基数,而 ​​M​​ 为被移除成员的数量

ZREMRANGEBYSCORE key min max

移除有序集 ​​key​​​ 中,所有 ​​score​​​ 值介于 ​​min​​​ 和 ​​max​​​ 之间(包括等于 ​​min​​​ 或 ​​max​​ )的成员

O(log(N)+M), ​​N​​​ 为有序集的基数,而 ​​M​​ 为被移除成员的数量

ZREVRANGE key start stop [WITHSCORES]

返回有序集 ​​key​​ 中,指定区间内的成员

O(log(N)+M), ​​N​​​ 为有序集的基数,而 ​​M​​ 为结果集的基数

ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

返回有序集 ​​key​​​ 中, ​​score​​​ 值介于 ​​max​​​ 和 ​​min​​​ 之间(默认包括等于 ​​max​​​ 或 ​​min​​​ )的所有的成员。有序集成员按 ​​score​​ 值递减(从大到小)的次序排列

O(log(N)+M), ​​N​​​ 为有序集的基数, ​​M​​ 为结果集的基数

ZREVRANK key member

返回有序集 ​​key​​​ 中成员 ​​member​​​ 的排名。其中有序集成员按 ​​score​​ 值递减(从大到小)排序

O(log(N))

ZSCORE key member

返回有序集 ​​key​​​ 中,成员 ​​member​​​ 的 ​​score​​ 值

O(1)

ZUNIONSTORE destination numkeys key

计算给定的一个或多个有序集的并集,其中给定 ​​key​​​ 的数量必须以 ​​numkeys​​​ 参数指定,并将该并集(结果集)储存到 ​​destination​

O(N)+O(M log(M)), ​​N​​​ 为给定有序集基数的总和, ​​M​​ 为结果集的基数

ZINTERSTORE destination numkeys key

计算给定的一个或多个有序集的交集,其中给定 ​​key​​​ 的数量必须以 ​​numkeys​​​ 参数指定,并将该交集(结果集)储存到 ​​destination​

O(NK)+O(Mlog(M)), ​​N​​​ 为给定 ​​key​​​ 中基数最小的有序集, ​​K​​​ 为给定有序集的数量, ​​M​​ 为结果集的基数