特性
- 有序且不可重复的集合
- 每个元素都会关联一个 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 详细介绍
- ziplist 编码的 Zset 使用紧挨在一起的压缩列表节点来保存,第一个节点保存 member,第二个保存 score。ziplist 内的集合元素按 score 从小到大排序,其实质是一个双向链表。虽然元素是按
- zskiplist + dictht
使用场景
- 热点话题、新闻等各种类型的排行榜
- 延迟队列
- 分布式定时器
- 时间窗口限流
命令使用
命令 | 说明 | 时间复杂度 |
---|---|---|
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 为结果集的基数 |
本文含有隐藏内容,请 开通VIP 后查看