Redis数据类型-zSet基本使用

发布于:2022-12-23 ⋅ 阅读:(360) ⋅ 点赞:(0)

在这里插入图片描述

特性

  • 有序且不可重复的集合
  • 每个元素都会关联一个 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 详细介绍

在这里插入图片描述

使用场景

  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 值在 minmax 之间(默认包括 score 值等于 minmax )的成员的数量 O(log(N)+M), N 为有序集的基数, M 为值在 minmax 之间的元素的数量
ZCOUNT key min max 返回有序集 key 中, score 值在 minmax 之间(默认包括 score 值等于 minmax )的成员的数量 O(log(N)+M), N 为有序集的基数, M 为值在 minmax 之间的元素的数量
ZINCRBY key increment member 为有序集 key 的成员 memberscore 值加上增量 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 值介于 minmax 之间(包括等于 minmax )的成员。有序集成员按 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 值介于 minmax 之间(包括等于 minmax )的成员 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 值介于 maxmin 之间(默认包括等于 maxmin )的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列 O(log(N)+M), N 为有序集的基数, M 为结果集的基数
ZREVRANK key member 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序 O(log(N))
ZSCORE key member 返回有序集 key 中,成员 memberscore 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 为结果集的基数
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到