Zset
- ZADD
- ZCARD
- ZCOUNT
- ZRANGE/ZREVRANGE
- ZRANGEBYSCORE
- ZPOPMAX/ZPOPMIN
- BZPOPMAX/BZPOPMIN
- ZRANK/ZREVRANK
- ZSCORE
- ZREM
- ZREMRANGEBYRANK
- ZREMRANGEBYSCORE
- ZINCRBY
- ZINTERSTORE/ZUNIONSTORE
- 内部编码
- 使⽤场景
ZADD
添加或者更新指定的元素以及关联的分数到 zset 中,分数应该符合 double 类型,+inf/-inf 作为正负极限也是合法的
ZADD 的相关选项:
- XX:仅仅⽤于更新已经存在的元素,不会添加新元素。
- NX:仅⽤于添加新元素,不会更新已经存在的元素。
- CH:默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。
- INCR:此时命令类似 ZINCRBY 的效果,将元素的分数加上指定的分数。此时只能指定⼀个元素和分数。
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member...]
时间复杂度:O(log(N))
ZCARD
获取⼀个 zset 的基数(cardinality),即 zset 中的元素个数
ZCARD key
时间复杂度:O(1)
ZCOUNT
返回分数在 min 和 max 之间的元素个数,默认情况下,min 和 max 都是包含的
ZCOUNT key min max
时间复杂度:O(log(N))
ZRANGE/ZREVRANGE
返回指定区间⾥的元素,分数按照升序 / 降序。带上 WITHSCORES 可以把分数也返回
ZRANGE(ZREVRANGE) key start stop [WITHSCORES]
时间复杂度:O(log(N)+M)
ZRANGEBYSCORE
返回分数在 min 和 max 之间的元素,默认情况下,min 和 max 都是包含的
ZRANGEBYSCORE key min max [WITHSCORES]
时间复杂度:O(log(N)+M)
ZPOPMAX/ZPOPMIN
删除并返回分数最⾼ / 最低的 count 个元素
ZPOPMAX(ZPOPMIN) key [count]
时间复杂度:O(log(N) * M)
BZPOPMAX/BZPOPMIN
ZPOPMAX / ZPOPMIN的阻塞版本
BZPOPMAX(BZPOPMIN) key [key ...] timeout
时间复杂度:O(log(N))
ZRANK/ZREVRANK
返回指定元素的排名,升序 / 降序
ZRANK(ZREVRANK) key member
时间复杂度:O(log(N))
ZSCORE
返回指定元素的分数
ZSCORE key member
时间复杂度:O(1)
ZREM
删除指定的元素
ZREM key member [member ...]
时间复杂度:O(M*log(N))
ZREMRANGEBYRANK
按照排序,升序删除指定范围的元素,左闭右闭(下标)
ZREMRANGEBYRANK key start stop
时间复杂度:O(log(N)+M)
ZREMRANGEBYSCORE
按照分数删除指定范围的元素,左闭右闭
ZREMRANGEBYSCORE key min max
时间复杂度:O(log(N)+M)
ZINCRBY
为指定的元素的关联分数添加指定的分数值
ZINCRBY key increment member
时间复杂度:O(log(N))
ZINTERSTORE/ZUNIONSTORE
求出给定有序集合中元素的交集 / 并集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数
ZINTERSTORE(ZUNIONSTORE) destination numkeys key [key ...] [WEIGHTS weight[weight ...]] [AGGREGATE <SUM | MIN | MAX>]
时间复杂度:O(NK)+O(Mlog(M)) N 是输⼊的有序集合中, 最⼩的有序集合的元素个数; K 是输⼊了 ⼏个有序集合; M 是最终结果的有序集合的元素个数.
内部编码
有序集合类型的内部编码有两种:
- ziplist(压缩列表):当有序集合的元素个数⼩于 zset-max-ziplist-entries 配置(默认 128 个), 同时每个元素的值都⼩于 zset-max-ziplist-value 配置(默认 64 字节)时,Redis 会⽤ ziplist 来作 为有序集合的内部实现,ziplist 可以有效减少内存的使⽤。
- skiplist(跳表):当 ziplist 条件不满⾜时,有序集合会使⽤ skiplist 作为内部实现,因为此时 ziplist 的操作效率会下降。
使⽤场景
有序集合⽐较典型的使⽤场景就是排⾏榜系统。例如常⻅的⽹站上的热榜信息,榜单的维度可能是多⽅⾯的:按照时间、按照阅读量、按照点赞量。本例中我们使⽤点赞数这个维度,维护每天的热榜